从3点计算法线

Jac*_*111 -3 matlab vector

我有三点

P0=[x0,y0,z0] 
P1=[x1,y1,z1] 
P2=[x2,y2,z2] 
Run Code Online (Sandbox Code Playgroud)

我想计算它们的正常值.我做的是:

normal = cross(P0-P1, P0-P2); 
Run Code Online (Sandbox Code Playgroud)

然后我想绘制正常,所以我做的是,

c = normal + P0 %end position of normal vector
quiver3(P0(1), P0(2), P0(3), c(1), c(2), c(3));
Run Code Online (Sandbox Code Playgroud)

但它没有用(看起来线和平面之间有一个角度.所以这不正常).

有什么建议吗?

Flo*_*ris 6

"它有一个角度所以它不正常".有两个问题.

第一个问题 - 你误解了quiver3命令的工作原理.前三个元素是箭袋的开始(箭头的后面),但接下来的三个不是端点(你的normal + P0) - 它们是方向.所以我认为你需要改变你的代码

normal = cross(P0-P1, P0-P2);
normal = normal / norm( normal ); % just to make it unit length
figure
quiver3(P0(1), P0(2), P0(3), normal(1), normal(2), normal(3));
axis equal
Run Code Online (Sandbox Code Playgroud)

您可以通过确认点积为零来确认向量是否与平面垂直:

disp(dot((P0 - P1, normal));
disp(dot((P0 - P2, normal));
Run Code Online (Sandbox Code Playgroud)

你会期望结果是"非常接近于零的数字" - 舍入误差通常会使事物完全为零(考虑任何小于1e-16的值比矢量长度小"0").