我正在寻找一种算法,该算法会在表面上找到不规则的形状,可能不是太不规则,如一个压扁的圆,并且在形状周围跟踪最多n个边的多边形。 ' n'最大值可能基于形状的区域。
答案 0 :(得分:2)
我会这样做:
计算所有曲线段的切线角度ang
及其变化dang
您可以使用atanxy或atan2
作为
ang[i] = atanxy(x[i]-x[i-1],y[i]-y[i-1]);
dang[i] = ang[i]-ang[i-1];
查找inflex积分(黑色)
在这些点上dang
的符号正在改变
dang[i-1]*dang[i+1]<0.0
但您需要正确处理dang=0.0
元素(需要在它们之前和之后扫描)。这些点将是输出多边形的基本骨架
添加bumps max points(绿色)
在这些点处,切线角度在最近的焦点之间,因此要找到两个焦点之间的最大点i0
和i1
找到最接近的角度
angavg=0.5*(ang[i0]+ang[i1])
不要忘记
|ang[i]-angavg|<=PI
所以+/- 2.0*PI
如果不是这样的话
现在您应该拥有闭合多曲线的所有重要点......
它应该是这样的:
CW / CCW 或红/蓝只表示dang[i]
的标志......
<强> [注释] 强>
应保留输出点类型(inflex / maxpoint),因为它可以在以后用于比较和检测形状......