【问题标题】:Minimal perpendicular vector between a point and a line点和线之间的最小垂直向量
【发布时间】:2012-09-27 18:57:26
【问题描述】:

好的,所以我正在尝试使分离轴定理算法起作用(用于碰撞检测),我需要找到点和线之间的最小垂直向量。我不是要求最小垂直距离(我知道如何找到),而是要求与该距离具有相同大小并且从任意点和线上的点开始的向量。我知道点的位置,线上的一个点,以及一个给出线方向的单位向量。

我尝试做的是首先找到点和线之间的最小距离。

下一部分令人困惑,但我: 1)找到点和我知道的线上的点之间的向量 2)找到线上的点和线上的点之间的向量加上给出线方向的单位向量 3)取这两个向量的叉积(我称之为叉积A) 4)取单位向量的叉积,给出线的方向和叉积A的向量(我称之为叉积B) 5)归一化叉积B 6)按最小距离缩放叉积B

无论如何,整个尝试都惨遭失败。谁能告诉我应该如何找到这个向量?

【问题讨论】:

  • 您是在编写程序来执行此操作,还是只是在尝试做物理/计算作业?
  • 这是一个我写的有趣的游戏,就像我说的它是为了碰撞检测。
  • 虽然这是一道物理题,因为它是一个通用的形式,它适用于其他领域。它帮助我找到了用于光线追踪的圆柱碰撞的法线。

标签: vector


【解决方案1】:

如果我正确理解了您的问题,我相信这就是您要寻找的:

P - point
D - direction of line (unit length)
A - point in line

X - base of the perpendicular line

    P
   /|
  / |
 /  v
A---X----->D

(P-A).D == |X-A|

X == A + ((P-A).D)D
Desired perpendicular: X-P

句点代表点积,|X-A|表示幅度。

【讨论】:

  • 对。这就是我所说的“句号”:)
  • 抱歉错过了。无论如何,它似乎想要工作,但由于某种原因,我的 SAT 算法有点偏离。事情在不应该发生的时候发生了冲突。我在想你给我的东西可能有效,因为现在碰撞看起来“更正确”了,而且我有各种各样的标记,现在看起来更接近目标。非常感谢,但不幸的是,我似乎在代码中犯了其他类型的错误。
  • 天哪,终于让它工作了,我无意中应用了两次旋转变换。
  • X == A + ((P-A).D)D,最后的D前面是什么操作数?
  • 回答我自己的问题:这是正常的标量乘法,因为(P-A).D 是一个标量。也许我昨​​天工作太晚了。
【解决方案2】:

从上图中,你有:

q = p + s --> s = q - p = q - (p2-p1) = q + p1 - p2

==> s^ = |q - p2 - p1| / |s|   (unitary vector)

Also:   |s| = |q| sin c = |q|sin(b-a)

b = arcsin (qy / |q|); a = arcsin( p1y / |p1| )

where: |q| = (qx^2 + qy^2)^1/2

【讨论】: