我正在尝试使用道格拉斯-普克算法来减少多边形的顶点数量。这个算法对于线和路径来说效果很好。
我的问题是,我想要优化的多边形是封闭的。当选择两个相邻的随机点进行优化时,除了起点和终点之外都能很好地工作,因为它们是固定的,无法被优化。
有没有一个好方法来选择一个起始点呢?
我正在尝试使用道格拉斯-普克算法来减少多边形的顶点数量。这个算法对于线和路径来说效果很好。
我的问题是,我想要优化的多边形是封闭的。当选择两个相邻的随机点进行优化时,除了起点和终点之外都能很好地工作,因为它们是固定的,无法被优化。
有没有一个好方法来选择一个起始点呢?
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
}
}
我会随机选择一个点(例如:所有点列表中的“第一个”点),并找到最远的点。这类似于在搜索与线段最远的点时算法的普通步骤。
我可能完全误解了这个问题,但听起来你只是想将Douglas-Peucker算法(http://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm)应用于多边形。唯一的原因是你不能将你的多边形视为起点和终点相同的线,因为该算法要求这两个点不同。
所以我建议在你的多边形上选择两个远离的任意点,然后运行两次Douglas-Peucker算法,一次是顺时针连接你的点之间的路径,一次是逆时针连接你的点之间的路径。
你的任意点保证会出现在最终的解决方案中,但除此之外,它就像是该算法的线性近似。
如果这还不够,请搜索LOD或细节级别,因为这个问题通常在计算机图形学中被称为这个名字,尽管你可能会遇到一堆关于解决具有相当复杂树结构的多面体问题的页面,这可能或可能不是你正在寻找的。