找到Douglas-Peucker闭合多边形算法的良好起点

时间:2012-01-16 08:20:48

标签: algorithm optimization polygon

我正在尝试使用Douglas-Peucker算法减少多边形的顶点 - 这对于线和路径来说非常好。

我的问题是我要优化的多边形是关闭的。当选择2个随机相邻点时,优化效果很好 - 除了起点和终点 - 因为它们是固定的并且无法优化。

有没有一种好方法可以选择一个起点?

4 个答案:

答案 0 :(得分:1)

我会随机选择一个点(例如:"所有点列表中的第一个"点)并找到最远点。这类似于从线段搜索最远点时算法的普通步骤。

答案 1 :(得分:0)

我可能在这里完全误解了这个问题,但听起来你只想让Douglas-Peucker算法(http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)适应多边形。并且您不能仅将多边形视为具有起点和终点的线的唯一原因是因为算法要求您将这两个点区分开来。

所以我建议在你的多边形上选择相距很远的两个任意点,然后运行Douglas-Peucker算法两次,一次用于顺时针方向点之间的路径,一次用于你的点之间的路径逆时针走。

您的任意点保证在最终解决方案中,但除此之外,它尽可能接近算法的线近似值。

如果这还不够,你应该搜索LOD或Level Of Detail,因为这就是计算机图形学中通常所说的问题,尽管你可能会碰到一堆关于解决多面体问题的网页相当复杂的树结构,可能是也可能不是你想要的。

答案 2 :(得分:0)

我在我的javascript库中做了类似的事情,在那里我找到了彼此距离最远的两个点,并用它们来优化多边形。

这里的片段我确信您可以适应您正在使用的任何语言:

function polygonPeuckerReduce(path, tolerance) {
    var points = [];
    if (path.length < 3) {
        return points.concat(path);
    } else {
        var widest = 0.0, startIndex = 0;
        // find the widest part of the polygon (only start index is necessary)
        for (var i = 0, l = path.length; i < l; i++) {
            var point = path[i];
            for (var j = i + 1; j < l; j++) {
                var distance = point.distanceTo(path[j]);
                if (distance > widest) {
                    startIndex = i;
                    widest = distance;
                }
            }
        }

        // re-order the points with the new starting point (faster method)
        points = path.splice(startIndex, path.length).concat(path);

        return PEUCKER_INTERNAL(points, tolerance); // the magic
    }
}

答案 3 :(得分:0)

另一种可能性是扫描所有三个连续顶点的集合,并选择距离连接其前任顶点和后继顶点的线最远的两个顶点,即选择属于原始数据集中两个最大角点的两个顶点。修复这两个顶点,然后将Douglas-Peucker应用于插入的顶点。

如果所有点都间距很近,这可能会很嘈杂。在这种情况下,不是简单地考虑三个顶点的连续集合,您可以从每个输入顶点向两个方向向外工作,使用Douglas-Peucker跳过每个方向上不必要的顶点。这将导致更大,更宽间隔的三元组。再次找到距离连接前驱/后继顶点的线最远的两个顶点,修复这些顶点,并将Douglas-Peucker应用于插入的顶点。

其他变化是可能的,但这应该比'随机&#34;提供更好的起点。或者&#34;最远的&#34;如其他答案中所述。