0

我无法找出解决以下问题的最佳方法。我尝试了多种解决它们的方法,但我总是遇到一些极端情况。

问题如下:

  1. 你有一个List坐标(x 和 y 点)形成一个封闭的多边形。该列表保证形成一个多边形,其中的点按顺时针方向排列。
  2. 您将获得Set来自上述坐标的坐标(x 和 y 点)List
  3. 您必须找出使用上述所有点形成的线的起点和终点Set

我遇到的问题是我无法弄清楚找到“最佳”起点和终点的方法。对于许多情况,您可以选择第一个和最后一个点(使用 的索引List)来形成起点和终点,但这可能会导致一条线比它必须的要长。

例如,假设我们有以下多边形: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 0 并且Set我们的线段必须包含以下坐标:0, 7, 3

如果我们找到最小和最大索引,我们得到index(0), index(7),所以我们可以形成线0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7,这是一条有效的线,但它比它需要的长。最好的线段是7 -> 0 -> 1 -> 2 -> 3.

如何Set以有效的方式找到最佳(包含所有点的最短)线段?

对于上下文:我正在开发一个使用 JTS 几何图形绘制形状的应用程序。使用贝塞尔曲线平滑绘制的形状以产生“弯曲边缘”。绘制形状后(通过放置点),用户可以编辑形状。我们想使用它们修改的点(形成上述)来计算起点和终点Set,这样我们就可以只“平滑”受影响的区域。

4

2 回答 2

1

所以我们有一个Set并且我们需要按照索引的顺序将这个集合放入List.

转换ISet=[Index(i, List) for i in Set]

下一个排序ISet

对于成对的连续项目ISet和对(最后一个,第一个)计算该对的距离。

用最大距离对这对进行罚款。那么最好的结束和开始就是那对。

于 2016-05-27T14:07:40.700 回答
1

将您的集合转换为排序列表,将此列表与其副本连接起来,其中每个元素都添加了多边形顶点数 N,然后在这个加倍列表中找到最长的空运行(邻居差异)。然后获取所需长度的子列表,将其转换为连续范围(但取元素模 N)

(0,3,7) + (0+8,3+8,7+8) = (0,3,7,8,11,15)

最大差异是 7-3,所以最好的情况子列表以 7 开头,它是

 (7%8 .. 11%8) = (7,0,1,2,3) 
于 2016-05-27T14:20:55.640 回答