Mở đầu

Bài viết này giúp bạn hình dung cách dời một điểm lên mặt phẳng trong không gian 3 chiều.Thông thường đây là một việc làm rất cần thiết và thường xuyên với các kĩ sư để áp dụng cho các bài toán cần xử lý hình học.

planeBiVector

Chiếu điểm lên mặt

Hình vẽ bên dưới cho thấy không gian hệ trục toạ độ và một mặt phẳng nằm trong hệ toạ độ đó, điểm nằm ngoài kia chính là điểm mà ta sẽ dời lên trên mặt phẳng.Ví dụ bạn có một danh sách đèn cần đặt tự động.Nhưng vấn đề ở đây là không phải trần của phòng nào cũng có cao độ như nhau.Vì vậy bạn cần tìm ra chính xác cao độ trần và dời những điểm đèn đến trần. Kiến trúc liên tục dời cao độ trần làm hệ thống MEP đầu báo khói , đèn, cảm biến,.... cũng phải di chuyển theo.Nếu hai nhóm liên tục thay đổi qua lại thì việc làm tay thiếu sót là điều không thể tránh khỏi.

bY5oU

Được rồi , lúc này mình sẽ biểu diễn chúng trên Dynamo để bạn dễ hình dung hơn .Ta có hai điểm và một mặt phẳng, số 1 chính là điểm mà ta cần dời, số 2 chính là điểm sau khi được dời , còn số 3 chính là mặt phẳng mà ta muốn điểm thứ nhất chiếu lên để ra điểm thứ hai.Bạn thấy đố, điểm thứ hai chính là kết quả của việc chiếu vector vuông góc với mặt phẳng thông qua khoảng cách từ điểm đó đến mặt phẳng vuống góc với vector chiếu.

Nói một cách tổng quát:

Nếu hướng mặt phẳng được xác định bởi vectơ [a, b, c]

Khi đó phương trình của bề mặt là: a * x + b * y + c * z = 0

Để chiếu một điểm lên mặt phẳng này, chúng ta cần tính vị trí trên mặt phẳng với khoảng cách ngắn nhất đến điểm.Mà điểm ngắn nhất ta sẽ sử dụng phương pháp bình phương nhỏ nhất hay nói cách khác chính là đường vuông góc từ mặt phẳng điểm điểm cần chiếu.

 PH f972f8bd 337e 4630 9c25 9d615651865c

Kết quả sau khi kiểm tra.Điểm nằm trên đường màu đỏ kia chính là điểm mà ta đã dời đi, điểm cần dời di chuyển ra xa bấy nhiêu thì điểm dời sẽ nằm trên mặt phẳng và di chuyển ra xa bấy nhiêu.

Ta có thể viết một cách ngắn gọn cho việc ta đã tìm ra điểm normar của mặt phẳng đó.

XYZ ProjectPointOntoPlane(
XYZ point,
XYZ planeNormal )
{
double a = planeNormal.X;
double b = planeNormal.Y;
double c = planeNormal.Z;
double dx = ( b * b + c * c ) * point.X - ( a * b ) * point.Y - ( a * c ) * point.Z;
double dy = -( b * a ) * point.X + ( a * a + c * c ) * point.Y - ( b * c ) * point.Z;
double dz = -( c * a ) * point.X - ( c * b ) * point.Y + ( a * a + b * b ) * point.Z;
return new XYZ( dx, dy, dz );
}

Hay một cách tổng quát hơn bằng việc tính khoảng cách ngắn nhất sau đó chiếu đến mặt phẳng.

public static XYZ ProjectOnto(this Plane plane, XYZ p)
{
double d = plane.SignedDistanceTo(p);
XYZ q = p - d * plane.Normal;
return q;
}
public static double SignedDistanceTo(this Plane plane, XYZ p)
{
XYZ v = p - plane.Origin;
return plane.Normal.DotProduct(v);
}
view raw ProjectOnto.cs hosted with ❤ by GitHub

Tham khảo

euclideanspace

Twitter: @ColinMcCrone