我目前在尝试从多边形 Voronoi 交集中获取剪切的单元格。
以下是我现在所拥有的:
我有一个多边形,并计算了其中的一些点以计算 Voronoi 图和下图中的红线为 Voronoi 边缘。 然后我使用算法从每个单元格中获取角点,现在我需要按正确方向(顺时针)获取角点,以生成单元格多边形。
找到一个单元格的角点
起初我使用这种方法:
private List<Vector> sortClockwise(List<Vector> points)
{
points = points.OrderBy(x => Math.Atan2(x.X, x.Y)).ToList();
return points;
}
但在一些特殊的凹多边形中,这种方法不起作用,正确的顺序会混乱。
有没有人有建议或提示,如何以最简单的方式完成这项工作?请考虑多边形点已经按正确顺序排列,但voronoi角落混乱,需要按照多边形点进行排序。
我的想法:
- 在单元格角落中找到第一个多边形点
- 沿着多边形方向前进,并查看voronoi顶点的点是否在该线上。
- 如果是:获取找到的voronoi边缘的端点,并查找共享的voronoi边缘。
- 如果找到共享边缘,请始终选择最右边的一个
- 一直进行直到达到第一个点
这是唯一的方法吗?
编辑 - 更新
好吧,我现在有了一半的答案。
正如我所说,我拥有属于voronoi单元之一的所有顶点,但顺序仍然混乱,因此我以重心为基础按角度对它们进行排序,就像这样:
private List<Vector> sortClockwiseBySentroid(List<Vector> points, Vector center)
{
points = points.OrderBy(x => Math.Atan2(x.X - center.X, x.Y - center.Y)).ToList();
return points;
}
但这并非总是有效的。以下是其工作和不工作的示例。问题在于,在凹边缘上,从质心到角落的角度有时会比我实际需要的角度更小。有什么建议如何解决这个问题吗?
这里是有效的
这里无效...