如何获取java Polygon的边界

时间:2015-12-05 21:43:05

标签: java

让我们说我有一个点网格,我使用一些函数来标记&​​#39;其中一些并将它们添加到常规Java Polygon,如下所示:

enter image description here

我应该如何确定Polygon的外边界是什么?最好根据需要返回少量点,如下所示:

enter image description here

我尝试了像getBounds或getPathIterator这样的Polygon方法,但是在我的情况下他们不会工作,因为那些也会使用内点。

此外,点之间的红线不应对角线。

1 个答案:

答案 0 :(得分:1)

您的图像已经说明了解决方案:您可以安全地删除3个连续点的中间如果这3个点形成一个垂直或水平线(这些点都具有相同的x或相同的y坐标)。

这可以编码为循环(伪代码,没有在编译器中测试它):

Point previous = null;
int vCount = 0, hCount = 0;
Iterator<Point> i = ...
List<Point> removablePoints = new ArrayList<>();
while (i.hasNext()) {
    Point current = i.next();
    if (previous != null) {
        if (current.x == previous.x) {
            ++hCount;
        } else {
            hCount = 1;
        }
        if (current.y == previous.y) {
            ++vCount;   
        } else {
            vCount = 1;
        }
   }
   if (vCount > 2) {
       removablePoints.add(current);
        --vCount;
   } else if (hCount > 2) {
       removablePoints.add(current);
       --hCount;
   }
   previous = current;
}

由于无法在迭代器循环中轻松删除前一个点,只需在列表中收集这些点并在循环后删除它们(未显示)。

原理很简单,只计算有多少连续的水平/垂直点,一旦发现两个以上的中间点(调整计数器以反映删除的点)。