用向量投影找到点

3

图片

我正在尝试使用LatLng点在Java中解决这个问题。

我看了这篇帖子Circle line-segment collision detection algorithm?

我有一个找到2点之间距离的方法。指令如下:

将向量AC投影到AB上。 投影向量AD给出新点D。 如果D和C之间的距离小于(或等于)R,则有交点。

我不了解向量,有人能告诉我如何在这里找到点D吗?

提前致谢


1
如果点A的坐标为(ax,ay)B,C,D同理,则线段CD的长度为|(cy-ay)(bx-ax)-(cx-ax)(by-ay)|/sqrt((bx-ax)^2+(by-ay)^2) - 如果我有时间,我会写一个详细的答案和证明。或者您可以去math.stackexchange.com寻求此类问题的专家帮助。 - Dawood ibn Kareem
感谢您的快速回复,与此同时,我也会尝试实现它。 - JustWe
问题仍然存在。我仍在寻找找到点D的方法。 - JustWe
D = A + AC*cos(angle)。我认为角度是30度 => D = A + AC/2。 - Arnaldo Ignacio Gaspar Véjar
没错,你说对了。好的,就像我说的那样,如果我有时间,我会稍后发布答案。 - Dawood ibn Kareem
显示剩余3条评论
2个回答

2
如果您真的需要D点坐标-让我们来看向量 AB = (B.X-A.X,B.Y-A.Y) AC = (C.X-A.X,C.Y-A.Y) 然后,我认为最简单的将C投影到AB的形式是: AD = AB * (AB.点.AC) / (AB.点.AB); 在坐标上:
CF=((B.X-A.X)*(C.X-A.X)+(B.Y-A.Y)*(C.Y-A.Y))/((B.X-A.X)^2+(B.Y-A.Y)^2)
D.X=A.X+(B.X-A.X)*CF
D.Y=A.Y+(B.Y-A.Y)*CF

正如David Wallace所写,距离CD为
|CD| = |AC x AB|/|AB| (x = 叉积)


谢谢,我会尝试验证,但是对于我来说测试可能需要一些时间,因此答案投票会比较慢。 - JustWe
CF变量是什么? - Petr
CF是向量方程AD = cf * AB中的无量纲参数(它与角CAB的余弦和AC长度成比例)。 - MBo

0

让我们将A,B,CD视为向量,并让

*表示2个向量的标量积,即结果是操作数对应坐标的乘积之和,以及

|X|表示向量x的长度,即坐标X的平方值之和的平方根

首先,我们找到垂直于F =(B-A)且包含C的平面P(对于2D空间,该平面是一条线):

该平面由以下方程描述(其中Z是平面上的任意点):

F * Z = F * C

AB的线G的方程是(t为实数):

F * t + A

要相交PG,您必须解决以下方程:

  (F * t + A) * F = F * C
t * |F|^2 + A * F = F * C
        t * |F|^2 = F * C - A * F
                t = (F * (C - A)) / (|F|^2)
                t = ((B - A) * (C - A)) / (|B-A|^2)

要得到 D,将 t 插入到 G 中:

D = F * t + A
  = (B-A) * t + A

在一个二维空间中,你得到:
ca1 = C1-A1
ca2 = C2-A2
ba1 = B1-A1
ba2 = B2-A2
t   = (ba1 * ca1 + ba2 * ca2) / (ba1 * ba1 + ba2 * ba2) 


D1 = ba1 * t + A1
D2 = ba2 * t + A2

其中C1C2C的坐标, A1A2A的坐标,等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接