我想在C ++中实现Ramer–Douglas–Peucker_algorithm。
伪代码如下所示:
function DouglasPeucker(PointList[], epsilon)
//Find the point with the maximum distance
dmax = 0
index = 0
for i = 2 to (length(PointList) - 1)
d = OrthogonalDistance(PointList[i], Line(PointList[1], PointList[end]))
if d > dmax
index = i
dmax = d
end
end
//If max distance is greater than epsilon, recursively simplify
if dmax >= epsilon
//Recursive call
recResults1[] = DouglasPeucker(PointList[1...index], epsilon)
recResults2[] = DouglasPeucker(PointList[index...end], epsilon)
// Build the result list
ResultList[] = {recResults1[1...end-1] recResults2[1...end]}
else
ResultList[] = {PointList[1], PointList[end]}
end
//Return the result
return ResultList[]
end
到目前为止,这是我的理解。 它是一个递归函数,包含一系列点和一个距离阈值。
然后它遍历当前点以找到具有最大距离的点。
我的正交距离功能有点迷失了。我该如何计算?我从未见过距离函数将线段作为参数。
我认为除此之外我应该没问题,我将只使用std :: vectors作为数组。我想我会使用std :: copy,然后按照算法的说法推送或弹出。
由于
答案 0 :(得分:5)
此图片中显示OrthogonalDistance
:
所以这是你的点与线上的点之间的距离,即线上该点的投影。
从点到线的距离通常是这样的:
alt text http://dida.fauser.edu/matetri/donati/retta/formdist.gif
其中 x0 和 y0 是外部点的坐标, a , b , c 是你的线的等式系数。
这就是我很久以前从学校里所记得的。
答案 1 :(得分:0)
从点P到线L的正交距离由点P和点P2之间的距离定义,其中P2是线L上P的正交投影。
如何计算此值取决于您所处理空间的尺寸,但如果它是2D,您应该能够通过在纸上绘制示例来解决这个问题!
答案 2 :(得分:0)
答案 3 :(得分:0)
可以找到所需数学的简要说明here。只是意识到在处理2D时可以将“正交”一词换成“垂直”。链接的站点具有由两个点定义的线的指令以及由斜率截距形式定义的线。
简短版本在此转载: 如果线以斜率截距表示:ax + by + c = 0,并且该点由x0,y0表示,那么将给出正交距离的函数是:
abs(a*x0 + b*y0 + c)/sqrt(a*a + b*b)
答案 4 :(得分:0)
我不清楚你是否希望点到(无限)线的距离通过两个点,或者到点所定义的线段的距离,但我怀疑它是后者。
考虑一下有点人为设想的点(0,0)(1,0)和(10,t)的例子,其中t很小。通过前两个点(即x轴)的线(10,t)的距离是t,而距线段的距离(10,t)是端点(0,0)和(1,0) )是hypot(9,t)~9。所以如果你使用距离线,那就有危险了 上面的算法不会在(10,t)分割。
jethro上面提到的方法处理行和线段。