找到它们之间距离的点

时间:2014-11-04 17:54:55

标签: algorithm geometry distance point euclidean-distance

以下是一个例子:

Suppose there are 4 points: A, B, C, and D

Given that Point A is at (0,0):
and the distances:

A to B: 7
A to C: 5
A to D: 9
B to C: 6
B to D: 5
C to D: 7

The goal would be to find a solution to points B(x,y), C(x,y) and D(x,y)

根据它们之间的距离,找到点(最多50个)的算法是什么?

1 个答案:

答案 0 :(得分:0)

好的,你有4个点A,B,C和D彼此分开,这样每对点之间的距离长度是AB = 7,AC = 5,BC = 6,AD = 9,BD = 5,CD = 7。 Axyz =(0,0,0),Bxyz =(7,0,0),Cxyz =(2.7,4.2,0),Dxyz =(7.5,1.9,4.6)(舍入到第一个小数)。

  • 我们在原点设置A点Axyz =(0,0,0)。
  • 我们将点B设置为x = 7,y = 0,z = 0 Bxyz =(7,0,0)。
  • 我们通过使用余弦定律找到C点的x坐标:

  • ((AB ^ 2 + AC ^ 2-BC ^ 2)/ 2)/ Bx = Cx

  • ((7- ^ 2 + 5 ^ 2-6 ^ 2)/ 2)/ 7 =
  • ((49 + 25-36)/ 2)/ 7 = 38/14 = 2.714286
  • 然后我们用毕达哥拉斯定理找到Cy:
  • SQRT(AC ^ 2-CX ^ 2)=赛扬
  • SQRT(25-7.367347)= 4.199
  • 所以Cxyz =(2.714,4.199,0)
  • 我们发现Dx与发现Cx的方式大致相同:
  • ((AB ^ 2 + AD ^ 2-BD ^ 2)/ 2)/ Bx = Dx
  • ((49 + 81-25)/ 2)/ 7 = 7.5 = Dx
  • 我们通过稍微不同的公式找到Dy:
  • (((AC ^ 2 + AD ^ 2-CD ^ 2)/ 2) - (CX DX *))/ DY
  • (((25 + 81-49)/ 2) - (2.714 * 7.5))/ 4.199 = 1.94(约)
  • 找到Dx和Dy,我们可以通过使用毕达哥拉斯定理找到Dz:
  • sqrt(AD ^ 2-Dx ^ 2-Dy ^ 2)=
  • sqrt(9 ^ 2-7.5 ^ 2-1.94 ^ 2)= 4.58
  • 所以Dxyz =(7.5,1.94,4.58)

如果在每组50个点之间有成对距离,则可能需要多达49个维度才能获得所有点的坐标。如果A,B,C,D和E都彼此相隔10个长度单位,那么你需要4个空间维度 - 如果你引入另一个点(F),它与所有其他点也是等距的,那么你将需要5个维度。无论需要多少维度,算法的工作方式都相同(事实上,当需要最大维数时,它的效果最好)。当距离违反三角形规则时,算法也有效 - 例如AB = 3,AC = 4,BC = 13 - 坐标为A = 0,0; B = 3,0;和C = -24,23.66i。如果违反了三角形规则,那么一些坐标将只是虚构的。没什么大不了。 通常对于点G,可以找到坐标(x1st,x2nd,x3rd,x4th,x5th和x6th):

  • G1st =((AB ^ 2 + AG ^ 2-BG ^ 2)/ 2)/(第B1)
  • G2nd =(((AC ^ 2 + AG ^ 2-CG ^ 2)/ 2) - (C1st * G1st))/(C2nd)
  • G3rd =(((AD ^ 2 + AG ^ 2-DG ^ 2)/ 2) - (D1st G1st) - (D2nd G2nd))/(D3rd)
  • G4th =(((AE ^ 2 + AG ^ 2-EG ^ 2)/ 2) - (E1st G1st) - (E2nd G2nd) - (E3rd * G3rd))/(E4th )
  • G5th =(((AF ^ 2 + AG ^ 2-FG ^ 2)/ 2) - (F1ST G1st) - (F2nd G2nd) - (F3rd G3rd) - ( F4th G4th))/(F5th)
  • G6th = SQRT(AG ^ 2-G1st ^ 2-G2nd ^ 2-G3rd ^ 2-G4th ^ 2-G5th ^ 2)

对于第5点,您可以找到使用lawofcosine计算的前三个坐标,并且您可以通过毕达索算法计算找到第四个坐标。对于第6个点,您可以找到前4个坐标和4个lawofcosine计算,然后通过毕达索算法计算得到最终坐标。对于第50个点,您可以找到前48个坐标和48个律法计算,第49个坐标是通过毕达索算法计算得到的。因此,对于50个点,将共计48个毕达哥拉斯定理计算加上1128个律法计算。

  • 算法相当简单:
  • A始终设置在原点,B设置为x = AB(或者更确切地说是B1st = AB)
  • 使用余弦定律((AB ^ 2 + AC ^ 2-BC ^ 2)/ 2)/(B1st)找到C1st
  • 然后用毕达哥拉斯定理找到C2nd(sqrt(AC ^ 2-C1st ^ 2))
  • 但是如果C2nd = 0?这不一定是个问题,但它可能成为查找D2nd,D3rd,E2nd,E3rd,E4th等的问题。
  • 如果AB = 4,AC = 8,BC = 4,那么我们将得到A(0,0),B(4,0)和C(8,0)。如果AD = 4,BD = 8,并且CD = 12,那么找到D的坐标将是没有问题的,这将是D(-4,0)。
  • 但是,如果CD不等于12,那么我们就会遇到问题。例如,如果CD = 5,那么我们可能会发现我们应该返回并以不同的顺序计算点的坐标,例如ACDB,这样我们就可以得到A =(0,0,0); C =(8 ,0,0); d =(3.44,2.04,0);和B =(4,-14.55,14.55i)。这是一个相当直观的解决方案,但它会中断算法的流程,因为我们必须倒退并以不同的顺序重新开始。
  • 不需要中断计算流程的问题的另一个解决方案是,每当毕康数算术计算给出零时,故意引入错误。 - 而不是零,将0.1或0.01作为C2nd坐标。这将允许人们继续计算剩余点的坐标而不会中断,并且最终结果的准确性将仅受到一点影响(事实上,无论如何,算法都会受到累积舍入误差的影响,所以这没什么大不了的)。在某些情况下,故意引入错误是获得解决方案的唯一方法:
  • 再次考虑4点A,B,C和D,距离如AB = 4,AC = 8,BC = 4,AD = 4,BD = 8,CD = 4(我们以前有过CD在12,CD在5)。当CD = 4时,无论您计算点数的顺序如何,都没有确切的解。来吧试试吧。
  • A =(0,0,0),B =(4,0,0),C =(8,0,0)......如果你在C2nd引入一个错误,那么你就把它放到0.1而不是零如果C =(8,0.1,0),则可以得到点D的坐标D =( - 4,640,640i)的解。如果你为C2nd引入一个较小的错误,使C =(8,0.01,0),那么得到D =( - 4,6400,6400i)。随着C2nd越来越接近零,D2nd和D3rd沿着同一方向越走越远。当两点之间的距离接近零时,有时会出现类似的结果。如果AB = 5,AC = 8,BC = 0,那么该算法将不会与实际等于零的距离一起工作。但它适用于BC = 0.000001。
  • 无论如何,我认为这回答了你一年前提出的问题。