我知道如何计算光线平面交点,但如何测试交点是否在该平面上的正方形内?我正在测试该点是否距离广场中心有一段距离,但我不确定这是否正确。
答案 0 :(得分:2)
这是一个适用于任何凸多边形的方法: (参见答案末尾的方块简化版)
设p1,p2,p3,p4表示正方形的四个顶点,让q表示射线与支撑平面之间的交点。设n表示 垂直于支撑平面的向量(例如,乘积(p2-p1)x(p3-p1))。
要确定q是否在平方中,请计算以下四个量:
o1=orient(q,p1,p2,n)
o2=orient(q,p2,p3,n)
o3=orient(q,p3,p4,n)
o4=orient(q,p4,p1,n)
其中
orient(a,b,c,n) = [(b-a) x (c-a)] . n
x: cross product; .: dot product
如果o1,o2,o3和o4具有相同的符号,则q在正方形(p1,p2,p3,p4)
它也适用于任何凸多边形(p1,p2,p3,p4,...,pn)
工作原理:
如果你是2D,你会计算:
o1 = det(p1-q, p2-q)
o2 = det(p2-q, p3-q)
o3 = det(p3-q, p4-q)
o4 = det(p4-q, p1-q)
其中det(v1,v2) = (x1*y2)-(x2*y1)
表示两个向量之间的行列式。
在英语中,如果o1,o2,o3,o4具有相同的符号,例如正数,则表示角度(p1,q,p2)为"左转"。如果所有角度(p1,q,p2),(p2,q,p3),(p3,q,p4)和(p4,q,p1)都是左转,则q在多边形内。每当它在外面时,有一个侧面(pi,pj),使得(pi,q,pj)进行"右转"。
现在,如果我们处于3D的任意平面中,就不再有像#34;左转"并且"右转",但是我们可以引入法向量n,并测试(q-p1,q-p2,n)是否是正或负的3D基础(这是{{1}计算)。
广场的特例
计算
orient()
如果X = (q-p1).(p2-p1) / ||(p2-p1)||
Y = (q-p1).(p3-p1) / ||(p3-p1)||
,那么q就在广场上(参见Mbo的回答)。
答案 1 :(得分:0)
答案取决于您的方块的定义方式。
如果square是轴对齐的,那么检查
就足够了(P.X >= Square.Left) and (P.X <= Square.Right) and
(P.Y >= Square.Top) and (P.Y <= Square.Bottom)
如果旋转方形,则将点投影到两个相邻边上并检查它们是否在边缘范围内。