如何根据距离数据在整个面板上分配点?

时间:2013-12-18 16:12:02

标签: c# winforms algorithm traveling-salesman

所以,我不确定如何正确解释这个问题,所以如果有什么不清楚请在评论中提问,我会尝试使用考试问题布局,这样你就可以轻松发现限制。

问题:

您的输入为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点的循环,并且在第一次迭代中我根据距离第一点的距离绘制点,下一步几乎肯定会废弃该解决方案,如果它查看距离第二点的距离和等......

1 个答案:

答案 0 :(得分:2)

如果只有距离数据,则有多个有效的点分布。

您可以在任何方向上将您的点集合转换为任意距离,并且比较距离将相同。因此,我们可以自由选择我们想要放置第一点的任何位置。将点1放在原点(0, 0)

您可以围绕任何轴旋转您的点集合,并且比较距离将相同。因此,我们可以自由选择放置第二个点的任何位置,只要距离第一个点的距离正确即可。将第2点放在(DistanceData[0].getDistances(1), 0)

有两个地方第3点可以去,同时仍然满足相对于第1点和第2点的距离:

enter image description here

我们可以使用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查找所有其他点的位置。