一个多边形由两个列表表示。列表xs
包含按降序排列的 x 坐标。对于每个 x 值,列表中的对应元素regions
是一个切片列表。每个切片表示属于多边形内部的范围。对于每个 x 值,切片按升序排序。
我想使用 Matplotlib 的fill
函数绘制填充的多边形。该函数需要对点进行排序,以便从点到点描述多边形的轮廓。如何对数据集中的点进行排序以获得正确的多边形?
这是我拥有的数据类型的示例。
xs = range(10, 0, -1)
regions = [[slice(0, 3)],
[slice(0, 4), slice(5.2, 5.8)],
[slice(1, 5), slice(5.4, 5.8)],
[slice(1.3, 6)],
[slice(1.8, 6)],
[slice(1.9, 3), slice(3.1, 6.1)],
[slice(2, 2.9), slice(3.2, 5), slice(6, 6.2)],
[slice(2.1, 2.7), slice(3.4, 5.1), slice(5.9, 6.3)],
[slice(3.5, 5.2), slice(5.7, 6.4)],
[slice(3.8, 5.3), slice(5.8, 6.1)]]
正确的点数排序方法如下
xx = [10, 9, 8, 7, 6, 5, 4, 3, 3, 4, 5, 5, 4, 3, 2, 1,
1, 2, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8,
9, 9, 8, 8, 9, 10]
yy = [0, 0, 1, 1.3, 1.8, 1.9, 2, 2.1, 2.7, 2.9, 3, 3.1,
3.2, 3.4, 3.5, 3.8, 5.3, 5.2, 5.1, 5, 6, 5.9, 5.7,
5.8, 6.1, 6.4, 6.3, 6.2, 6.3, 6, 6, 5.8, 5.8, 5.2,
5.4, 5, 4, 3]
并且这个数字应该看起来像这样
到目前为止,我已经尝试定义转折点,即轮廓改变方向的 x 值。这可以通过numpy.diff
应用于包含每个 x 值的切片数的数组来完成。如果差异不为零,则该 x 值是一个转折点。这可能可以用来找出下一点。困难在于确定下一个切片以及是使用切片的开头还是结尾。
这个问题很相似,但在我的情况下,多边形的形状要复杂得多。另一方面,我确实有关于多边形内部的信息。
编辑
我刚刚意识到,上述问题并不总是有唯一的解决方案。例如,上面示例中的点集也承认解决方案
xx = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 5,
4, 3, 3, 4, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8,
9, 9, 8, 8, 9, 10]
yy = [0, 0, 1, 1.3, 1.8, 1.9, 2, 2.1, 3.5, 3.8, 5.3, 5.2,
2.7, 2.9, 3, 3.1, 3.2, 3.4, 5.1, 5, 6, 5.9, 5.7,
5.8, 6.1, 6.4, 6.3, 6.2, 6.1, 6, 6, 5.8, 5.8, 5.2,
5.4, 5, 4, 3]
我正在寻找的解决方案是最小化每个边缘斜率的绝对值(垂直段除外)的解决方案。在上面的示例中,这对应于第一个解决方案。