我已画出该问题的2D表示,但最终我将不得不在3维上解决这个问题。
在由俯仰和偏航给出的方向上从原点到无穷远绘制一条线。在该点的前面有一个与轴对齐的框。
我想获取框上最接近直线的点的坐标,或者,如果相交,则最接近原点。
也就是说,如果将线“转向”盒子,盒子的哪个点将首先与该线相交?
答案 0 :(得分:0)
使用基点P0
,方向向量D
和参数t
对射线进行参数表示
P = P0 + t * D
获取射线与矩形边缘的交点的t(类似于3d):
Rect.Right = X0 + t * D.X
找出最先出现的相交点(较小的t),检查相交点的坐标。如果在内部边缘-找到点。如果不是,请使用edgr连续性分析相交参数,以确定哪个角(可能是3d中的边)最接近
请注意,在二维情况下,仅需要检查两个可能的边缘-取决于射线方向。例如-左图和右图。当您发现相交超出边缘时-检查两个角中的哪个更近。 3d相同-但是三个面可以相交,而更多的边或角则可以相交。
答案 1 :(得分:0)
让点的位置为(x0,y0,z0)
,并且框具有x1 (x2,y2,z2)
。根据偏航ψ和俯仰角θ,沿线的单位矢量将由给出
(u,v,w) = (cos ψ sin θ, sin ψ, cos ψ cos θ)
该行是(x0,y0,z0) + t (u,v,w)
与包含盒子面的平面之一相交是微不足道的。说找到与平面x = x1的交点,只需要求解
x0 + u t = x1
如此t = (x1-x0)/u
。一旦找到它,就很容易检查相交是否包含在面部中。
如果线条不与面相交,则会发生棘手的情况。在这里,我们有一对skew lines,并希望找到每条线上最接近的一对点。
考虑从(x1,y1,z1)到(x2,y1,z1)到边缘的最近点。
我们要找到参数s,t使得点
(x0,y0,z0)+s(u,v,w)
(x1,y1,z1)+t(1,0,0)
是最近的。连接这些点的线段必须垂直于两条线。沿着这条线的向量是叉积
N = (u,v,w) X (1,0,0) = (0,w,-v)
现在考虑穿过(x1,y1,z1)的平面,该平面跨越(1,0,0)和N,这是正常的
N2 = (1,0,0) X N
= (1,0,0) X (0,w,-v)
= (0,v,w)
平面由
定义P . N2 = (x1,y1,z1) . N2
在我们的光线上点一个点
( (x0,y0,z0)+s(u,v,w) ) . N2 = (x1,y1,z1) . N2
(x0,y0,z0) . N2 + s (u,v,w) . N2 = (x1,y1,z1) . N2
s (u,v,w) . N2 = ((x1,y1,z1)-(x0,y0,z0)) . N2
s (v^2+w^2) = (y1-y0) v + (z1-z0) w
如此
s = [ (y1-y0) v + (z1-z0) w ] / (v^2+w^2)
我们可以对框上的每个边缘重复以上操作,找到最接近的点并选择最小的点。