平面可以用多种方式定义。通常使用平面上的点和法向量。从三个点获取法线向量 (P1
, P2
, P3
) 取三角形边的叉积
P1 = {x1, y1, z1};
P2 = {x2, y2, z2};
P3 = {x3, y3, z3};
N = UNIT( CROSS( P2-P1, P3-P1 ) );
Plane P = { P1, N }
反过来,从一个点开始P1
和正常的N
到三点,你从任何方向开始G
not沿着正常的N
这样DOT(G,N)!=0
。那么沿着平面的两个正交方向是
//try G={0,0,1} or {0,1,0} or {1,0,0}
G = {0,0,1};
if( MAG(CROSS(G,N))<TINY ) { G = {0,1,0}; }
if( MAG(CROSS(G,N))<TINY ) { G = {1,0,0}; }
U = UNIT( CROSS(N, G) );
V = CROSS(U,N);
P2 = P1 + U;
P3 = P1 + V;
线由点和方向定义。通常有两点(Q1
, Q2
) 定义线
Q1 = {x1, y1, z1};
Q2 = {x2, y2, z2};
E = UNIT( Q2-Q1 );
Line L = { Q1, E }
直线和平面的交点由直线上的点定义r=Q1+t*E
与平面相交,使得DOT(r-P1,N)=0
。这已解决标量距离t
沿着线作为
t = DOT(P1-Q1,N)/DOT(E,N);
和位置为
r = Q1+(t*E);
注意:DOT()
返回两个向量的点积,CROSS()
叉积,以及UNIT()
单位向量(幅度=1)。
DOT(P,Q) = P[0]*Q[0]+P[1]*Q[1]+P[2]*Q[2];
CROSS(P,Q) = { P[1]*Q[2]-P[2]*Q[1], P[2]*Q[0]-P[0]*Q[2], P[0]*Q[1]-P[1]*Q[0] };
UNIT(P) = {P[0]/sqrt(DOT(P,P)), P[1]/sqrt(DOT(P,P)), P[2]/sqrt(DOT(P,P))};
t*P = { t*P[0], t*P[1], t*P[2] };
MAG(P) = sqrt(P[0]*P[0]+P[1]*P[1]+P[2]*P[2]);