所以,我不确定如何正确解释这个问题,所以如果有什么不清楚请在评论中提问,我会尝试使用考试问题布局,这样你就可以轻松发现限制。
问题:
您的输入为Panel
(固定大小),PointF[]
固定大小n
的数组,以及包含每对点之间距离的距离数据在大小为n
的索引数组中,可通过以下方式通过DistanceData
字段访问:
DistanceData[i].getDistances(k)
返回int
,表示第i个点和第k个点之间的距离。作为推论,DistanceData[k].getDistances(i)
返回相同的值。如果i==k
,则返回0
。
您的任务是更新Panel
,以便诚实地代表DistanceData
,即如果DistanceData[1].getDistances(3) < DistanceData[1].getDistances(4)
,那么面板应显示比第1和第4点更近的第1和第3点等。
注意:距离数据的输入与先前在面板上绘制的点无关。或者更确切地说,Panel仅包含点数,您需要根据DistanceData
中的值来分发它们。
注意#2:标签“travel-salesman”会提醒您所有点都相互依赖,即所有对都有唯一的距离。
我的看法:我面临的问题是,如果我一点一点地迭代解决这个问题,我发现我打破了我在前面的步骤中所做的解决方案。为了说明这一点:如果我运行一个4点的循环,并且在第一次迭代中我根据距离第一点的距离绘制点,下一步几乎肯定会废弃该解决方案,如果它查看距离第二点的距离和等......
答案 0 :(得分:2)
如果只有距离数据,则有多个有效的点分布。
您可以在任何方向上将您的点集合转换为任意距离,并且比较距离将相同。因此,我们可以自由选择我们想要放置第一点的任何位置。将点1放在原点(0, 0)
。
您可以围绕任何轴旋转您的点集合,并且比较距离将相同。因此,我们可以自由选择放置第二个点的任何位置,只要距离第一个点的距离正确即可。将第2点放在(DistanceData[0].getDistances(1), 0)
。
有两个地方第3点可以去,同时仍然满足相对于第1点和第2点的距离:
我们可以使用Circle-Circle intersection公式来确定点3的x坐标。
d = distance between point 0 and point 1
R = distance between point 1 and point 3
r = distance between point 2 and point 3
x = (d^2 - r^2 + R^2)/(2*d)
点3的y坐标有两种可能的解决方案。您可以通过重新安排毕达哥拉斯公式中的术语来找到它们。
y = sqrt(R^2 - x^2)
or
y = -sqrt(R^2 - x^2)
您可以在x轴上翻转您的点集合,并且比较距离将相同,因此您可以选择您喜欢的y值中的任何一个。我更喜欢积极的。
你现在知道三点的位置了。然后,您可以使用trilateration查找所有其他点的位置。