让我们说我有一个点网格,我使用一些函数来标记'其中一些并将它们添加到常规Java Polygon
,如下所示:
我应该如何确定Polygon
的外边界是什么?最好根据需要返回少量点,如下所示:
我尝试了像getBounds或getPathIterator这样的Polygon方法,但是在我的情况下他们不会工作,因为那些也会使用内点。
此外,点之间的红线不应对角线。
答案 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;
}
由于无法在迭代器循环中轻松删除前一个点,只需在列表中收集这些点并在循环后删除它们(未显示)。
原理很简单,只计算有多少连续的水平/垂直点,一旦发现两个以上的中间点(调整计数器以反映删除的点)。