Mở đầu

Hôm nay mình sẽ nói về một dạng nho nhỏ để các bạn hiểu hơn về node Vector.DotVector.Cross trong Dynamo hay nói cụ thể hơn chính là Dot ProductCross Product trong RevitAPI mà mình đang tác chiến thực tế.

Nói nôm na theo tiếng việt thì nó chính là tích vô hướng(Dot Product) và tích có hướng(Cross Product) của hai vectơ.

Tích vô hướng được tính với một hàm cos còn tích có hướng được tính với một hàm sin.Thay vì mình đi tìm hiểu sâu hơn thì tốt hơn hết thì mình nên học cách áp dụng công thức đã chứng minh sẽ tốt hơn.Bài này mình sẽ nói về mặt phẳng không gian nhé.Còn muốn chọc sâu coi thử tại sao lại sin và tại sao lại là cos thì có thể xem tại đây

Tích vô hướng trả về một đại lượng góc hợp giữa hai vectơ còn có hướng thì trả về một giả vectơ mới với điều kiện là vuông góc với hai vectơ ban đầu.

Định nghĩa Dot Product

  • Định nghĩa được túm váy lại như sau:

dinhnghiatichvohuong

dinhnghiatichvohuong4

  • Ví dụ về mặt phẳng 2D :

dinhnghiatichvohuong1

Từ ví dụ trên mà ta có thể biết luôn một tính chất của nó là hai vectơ vuông góc thì kết quả sẽ ra bằng 0 vì Cos(90) bằng 0, hehe.

  • Ví dụ với không gian 3 chiều Oxyz :

dinhnghiatichvohuong2

  • Thử đưa vô Dynamo coi có đúng không nhỉ :

dinhnghiatichvohuong3

Ở kết quả này ta thấy thêm một thông số nữa là chiều dài của tổng vectơ kia, chính là căn bậc hai bình phương của công thức trên mà ra.Vậy là hiểu rồi nhé 😁

Code thực tế sẽ như thế này để các bác dễ hình dung hơn :

/// <summary>
/// Return DotProduct of two Vector
/// </summary>
/// <param name="vector"></param>
/// <param name="other"></param>
/// <returns></returns>
public static double Dot(Autodesk.DesignScript.Geometry.Vector vector,
Autodesk.DesignScript.Geometry.Vector other)
{
return vector.X * other.X + vector.Y * other.Y + vector.Z * other.Z;
}
view raw DotProduct.cs hosted with ❤ by GitHub
/// <summary>
/// Obtains the dot product of two vectors.
/// </summary>
/// <param name="u">Vector3.</param>
/// <param name="v">Vector3.</param>
/// <returns>The dot product.</returns>
public static double DotProduct(this XYZ u, XYZ v)
{
return u.X * v.X + u.Y * v.Y + u.Z * v.Z;
}
view raw DotProduct2.cs hosted with ❤ by GitHub

Định nghĩa Cross Product

Tích có hướng là một phép toán nhị nguyên trên các vectơ trong không gian vectơ ba chiều. Nó là một trong hai phép nhân thường gặp giữa các vectơ (phép toán kia là nhân vô hướng). Nó khác nhân vô hướng ở chỗ là kết quả thu được là một giả vectơ thay cho một vô hướng. Kết quả này vuông góc với mặt phẳng chứa hai vectơ đầu vào của phép nhân.

tichcohuong

Đọc cái trên là đọc chơi cho biết chứ mà mình không áp dụng thì sớm muộn gì cũng bay theo gió mà thôi, cái mà hồi xưa mình đi học bị gọi là nước đổ đầu vịt ấy 😁.

  • Cùng xem một ví dụ không gian 3 chiều thử có gì vui không :

tichcohuong1

  • Kiếm tra trên Dynamo luôn cho nóng 😁 :

tichcohuong2

Kết quả thành công mĩ mãn mà không cần phải ngồi bấm máy tính nữa rồi.Vậy là giờ hiểu tại sao lại có kết quả như trên rồi nhé.

Code thực tế sẽ như thế này :

/// <summary>
/// Cross Product Vector
/// </summary>
/// <param name="vector"></param>
/// <param name="other"></param>
/// <returns></returns>
public static Autodesk.DesignScript.Geometry.Vector Cross(Autodesk.DesignScript.Geometry.Vector vector,
Autodesk.DesignScript.Geometry.Vector other)
{
var x = vector.Y * other.Z - vector.Z * other.Y;
var y = vector.Z * other.X - vector.X * other.Z;
var z = vector.X * other.Y - vector.Y * other.X;
Autodesk.DesignScript.Geometry.Vector v = Autodesk.DesignScript.Geometry.Vector.ByCoordinates(x, y, z);
return v;
}
view raw CrossProduct.cs hosted with ❤ by GitHub
/// <summary>
/// Obtains the cross product of two vectors.
/// </summary>
/// <param name="u">Vector3.</param>
/// <param name="v">Vector3.</param>
/// <returns>Vector3.</returns>
public static XYZ CrossProduct(this XYZ u, XYZ v)
{
double a = u.Y * v.Z - u.Z * v.Y;
double b = u.Z * v.X - u.X * v.Z;
double c = u.X * v.Y - u.Y * v.X;
return new XYZ(a, b, c);
}

Mở rộng

Chuyện kể rằng : Anh vô hướng còn được gọi là Anh vô bờ bến không có nhà cửa và vợ con như ông có gia đình kia.Một ngày nọ, hai Anh vô hướng gặp lại nhau và ngồi tâm sự, và rồi câu chuyện thực tế bắt đầu từ đây.

Một ví dụ đơn giản là kiểm tra hai Vectơ đó là cùng hướng hay ngược hướng để các bác tự nghiệm mà làm thử nhé, nếu nó cùng hướng với nhau thì góc thu hẹp nhỏ nhất là 0 và ngược hướng thì góc thu hẹp là 180 độ.

Chúc các bác thành công.

Bên trên chỉ là vắn tắt nhỏ của mình lại để mọi người đọc sơ cũng có thể hiểu, còn muốn chuyên sâu hơn thì các bác xem thêm tại các link bên dưới nhé.Cám ơn các bác đã đọc bài viết.

Tham khảo

Cross Product

Dot Product

apecceosummit2017

loigiaihay.com