【发布时间】:2011-07-02 09:23:57
【问题描述】:
我有一个 boolean[][] ,其中真正的索引构成一个实心多边形。有了这些信息,我怎么能
- A.确定哪些块构成了周边,并且
- 乙。哪些点(按顺序)可以使用多边形类绘制多边形。
我打算使用 Polygon 类来调用 .contains,但我目前的代码给了我乱序的多边形点(因为我只是从左到右、从上到下扫描)。对此主题的任何帮助表示赞赏。
【问题讨论】:
我有一个 boolean[][] ,其中真正的索引构成一个实心多边形。有了这些信息,我怎么能
我打算使用 Polygon 类来调用 .contains,但我目前的代码给了我乱序的多边形点(因为我只是从左到右、从上到下扫描)。对此主题的任何帮助表示赞赏。
【问题讨论】:
我认为您只需要确定角点并将它们连接起来。凸包算法可能不起作用,因为多边形可能不是凸的。例如,wikipedia page for polygons 上左起第三个多边形(绿色)不是凸的。同样对于已经是凸面的多边形,凸包算法可能会过大。
除非我弄错了,否则根据点邻居的状态,布尔值列表中应该有四种类型的点。在常规网格中,索引 i,j 处的元素应该有 8 个邻居。基于这 8 个邻居,假设您的多边形不接触该区域的任何边缘,您应该有四种不同类型的点:
您可以检查布尔值并挑选出多边形的所有边缘点(当多边形接触区域边缘时,您必须格外小心,例如存在真值在最小的行和最小的列)。一旦有了边缘点,您就可以通过反复试验确定哪些点连接到哪些点。尝试连接两个点并查看边是否有效。如果边缘是有效的,那么它将在一侧具有所有真值,而在另一侧具有所有假值,直至合理的余量或误差。如果它没有这个属性,那么它一定不是多边形的一条边。
【讨论】:
这听起来像凸包算法是不够的,因为多边形可能是凹的。您想要的是矢量算法的位图。查看此链接以了解此类算法的描述:http://cardhouse.com/computer/vector.htm
一旦获得多边形点,您就可以对每个线段进行距离计算。
【讨论】:
你需要几个算法
首先:一种将 boolean[][] 转换为一组 X-Y 坐标的方法。
第二种:将这些点转换为多边形的方法(阅读 Convex Hull 算法)
第三:一种计算多边形周长的方法。
现在去填空吧!
【讨论】:
您正在寻找Convex Hull algorithm。
【讨论】: