我遇到了问题,不知道怎么解决。
我试图对点列表进行排序,以便所有点都形成一条路径。到目前为止,我所做的是计算列表中所有点的中心点,然后使用this post中的代码进行排序。以下是借用的代码段:
public int Compare(Point3D pointA, Point3D pointB)
{
if (pointA.X - CenterPoint.X >= 0 && pointB.X - CenterPoint.X < 0)
return 1;
if (pointA.X - CenterPoint.X < 0 && pointB.X - CenterPoint.X >= 0)
return -1;
if (pointA.X - CenterPoint.X == 0 && pointB.X - CenterPoint.X == 0)
{
if (pointA.Y - CenterPoint.Y >= 0 || pointB.Y - CenterPoint.Y >= 0)
if (pointA.Y > pointB.Y)
return 1;
else return -1;
if (pointB.Y > pointA.Y)
return 1;
else return -1;
}
// compute the cross product of vectors (CenterPoint -> a) x (CenterPoint -> b)
double det = (pointA.X - CenterPoint.X)*(pointB.Y - CenterPoint.Y) -
(pointB.X - CenterPoint.X)*(pointA.Y - CenterPoint.Y);
if (det < 0)
return 1;
if (det > 0)
return -1;
// points a and b are on the same line from the CenterPoint
// check which point is closer to the CenterPoint
double d1 = (pointA.X - CenterPoint.X)*(pointA.X - CenterPoint.X) +
(pointA.Y - CenterPoint.Y)*(pointA.Y - CenterPoint.Y);
double d2 = (pointB.X - CenterPoint.X)*(pointB.X - CenterPoint.X) +
(pointB.Y - CenterPoint.Y)*(pointB.Y - CenterPoint.Y);
if (d1 > d2)
return 1;
else return -1;
}
在某些情况下,它工作良好,但有时它会产生奇迹,请参阅所附图片,黑点是计算中心点:
在图片a中,一切都可以,但是如果我决定向上移动形成两条水平线的点,我会遇到这样的情况:
绿线是它应该看起来的样子,黑线是它真正看起来的样子,我不明白我为什么会那样。我也尝试了
atan()
解决方案,但结果相同任何帮助都将不胜感激。 最佳答案
两个例子中按顺时针方向排列的点都很好但对于第二个例子来说,它的方法并不合适顺时针算法只适用于凸图形。
这是不支持图形的示例,没有可用的中心点。
所以如果你有一些点,不知道如何链接它们,也不知道任何关于图形的东西,你就不能恢复原始图形。
关于c# - 顺时针排序点列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36336864/