【问题标题】:How can I determine the perimeter of a polygon based on a collection of X,Y如何根据 X,Y 的集合确定多边形的周长
【发布时间】:2011-07-02 09:23:57
【问题描述】:

我有一个 boolean[][] ,其中真正的索引构成一个实心多边形。有了这些信息,我怎么能

  • A.确定哪些块构成了周边,并且
  • 乙。哪些点(按顺序)可以使用多边形类绘制多边形。

我打算使用 Polygon 类来调用 .contains,但我目前的代码给了我乱序的多边形点(因为我只是从左到右、从上到下扫描)。对此主题的任何帮助表示赞赏。

【问题讨论】:

    标签: java math polygon


    【解决方案1】:

    我认为您只需要确定角点并将它们连接起来。凸包算法可能不起作用,因为多边形可能不是凸的。例如,wikipedia page for polygons 上左起第三个多边形(绿色)不是凸的。同样对于已经是凸面的多边形,凸包算法可能会过大。

    除非我弄错了,否则根据点邻居的状态,布尔值列表中应该有四种类型的点。在常规网格中,索引 i,j 处的元素应该有 8 个邻居。基于这 8 个邻居,假设您的多边形不接触该区域的任何边缘,您应该有四种不同类型的点:

    1. 内部点 - 将所有 8 个相邻值设置为 true 的点
    2. 内部边缘点 - 值为 true 且 8 个邻居中有 5 个设置为 true 的点。这些点位于多边形的远边缘,但不在两个多边形边缘的交点
    3. 多边形边缘点 - 值为 true 且 8 个邻居中少于 5 个设置为 true 的点。这些点是多边形的角点。
    4. 外部点 - 值为 false 的点

    您可以检查布尔值并挑选出多边形的所有边缘点(当多边形接触区域边缘时,您必须格外小心,例如存在真值在最小的行和最小的列)。一旦有了边缘点,您就可以通过反复试验确定哪些点连接到哪些点。尝试连接两个点并查看边是否有效。如果边缘是有效的,那么它将在一侧具有所有真值,而在另一侧具有所有假值,直至合理的余量或误差。如果它没有这个属性,那么它一定不是多边形的一条边。

    【讨论】:

      【解决方案2】:

      这听起来像凸包算法是不够的,因为多边形可能是凹的。您想要的是矢量算法的位图。查看此链接以了解此类算法的描述:http://cardhouse.com/computer/vector.htm

      一旦获得多边形点,您就可以对每个线段进行距离计算。

      【讨论】:

        【解决方案3】:

        你需要几个算法

        首先:一种将 boolean[][] 转换为一组 X-Y 坐标的方法。

        第二种:将这些点转换为多边形的方法(阅读 Convex Hull 算法)

        第三:一种计算多边形周长的方法。

        现在去填空吧!

        【讨论】:

          【解决方案4】:

          您正在寻找Convex Hull algorithm

          【讨论】:

            猜你喜欢
            • 2017-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-23
            • 1970-01-01
            • 2021-12-05
            • 2014-08-19
            相关资源
            最近更新 更多