盒子上最接近直线的点

时间:2018-12-23 18:27:56

标签: math geometry

enter image description here

我已画出该问题的2D表示,但最终我将不得不在3维上解决这个问题。

在由俯仰和偏航给出的方向上从原点到无穷远绘制一条线。在该点的前面有一个与轴对齐的框。

我想获取框上最接近直线的点的坐标,或者,如果相交,则最接近原点。

也就是说,如果将线“转向”盒子,盒子的哪个点将首先与该线相交?

2 个答案:

答案 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 (x1,y1,z1)和(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) 

我们可以对框上的每个边缘重复以上操作,找到最接近的点并选择最小的点。