连续的点在一个误差允许范围内,如何用多个直线来拟合.

zsjiaming 2006-01-03 04:32:01
我的点阵图中的有一组连续的点(不交叉,但不是直线)

这组连续的点没有规律(也就是随机的,是个曲线).

那么如何把这些点阵用直线拟合.并且要求点到直线的距离小于一个值

这些连接起来的多个直线最终拟合了这些点.(其实这也是一个矢量化的问题)

请教这应该是一个什么样的算法.

(1)要求,直线越少越好.
(2)速度不能太慢,因为有大量的点.这只是一个分支.
(3)主要是成熟的算法(不一定要有代码)请详细说明或网址也行.
(4)这个问题和多个字用一个直线拟合不同.








...全文
625 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
syy64 2006-01-05
  • 打赏
  • 举报
回复
还有一种方法:
取第一点与最后一点组成直线,1......n,然后从2开始计算到该直线的距离,直到第一次出现大于阈值的点,则取前一点与末点组成的直线,按同一方法找出所有的点;
至于那种方法速度快,在进行理论研究的基础上,要通过多种方法试验才知道,而且要通过大量的数据才能试出来。
laofang 2006-01-04
  • 打赏
  • 举报
回复
楼上的算法好像有问题:
如果中间的所有点,与第一点和第N点组成的直线间的距离都小于某个阈值,但如果这些点都在这条直线的一侧,那这条直线好像不是我们找的拟合直线吧:)
syy64 2006-01-04
  • 打赏
  • 举报
回复
首先以第一点与第三点组成的直线,然后求第二点与该直线的距离,如果距离小于阈值,在以第一点与第四点为直线,求第二和第三点到直线的距离,如果小于阈值,再以第一和第五点为直线,直到距离大于阈值,则取前一点与第一点组成的直线;依此类推,求出所有的点。
zsjiaming 2006-01-04
  • 打赏
  • 举报
回复
(8)计算(xn,yn)允许的从(x0,y0)开始的直线最大角度maxβ,最小角度minβ
如果maxβ<m_maxβ 那么m_maxβ=maxβ
如果minβ>m_minβ 那么m_minβ=minβ
保证m_minβ m_maxβ对所有已经算过的点都有效////
zsjiaming 2006-01-04
  • 打赏
  • 举报
回复
=====>yy64(太平洋)
方法应该可以.因为并不要求所以的点在直线上,
只要求所有的点到最近的直线的距离小于1个值.

这方法我想过,但是可能会很慢.因为每判定一直线是否合适,
都要计算每一个到这直线的距离.

我想到一个算法.但是对VC运算速度方面的技巧还了解不多,希望大家参谋参谋一下:
(0)允许误差ΔL
(1)从起点取Point(x0,y0)
(2)取下一个点Point(x1,y1)
(3)计算(x0,y0)--(x1,y1)直线的角度(tag(β)=(y1-y0)/(x1-x0)也就是直线与x轴的夹角)
或者用斜率(也就是y=ax+b中的a)主要是看哪种运算更快.
计算: tag(β)=(y1-y0)/(x1-x0) .....可得β

(4)计算(x1,y1)允许的从(x0,y0)开始的直线最大角度maxβ,最小角度minβ
// 或者是允许的最大斜率最小斜率.
计算: 如果在(x1,y1)点上做以ΔL为半径的圆,那么从(x0,y0)点到这
个圆可以做二条切线.此切线与原直线(x0,y0--x1,y1)的夹角为α.
L=sqrt((x1-x0)^2+(y1-y0)^2) (x0y0与x1y1这二点的距离)
sin(α)=ΔL/L (因为切线与半径成直角)
这样可以算出α
m_maxβ=β+α //上面的切线
m_minβ=β-α //下面的切线
(5)保存(4)中的角度m_maxβ,m_minβ
(6)取下一个点(xn,yn)
(7)计算(x0,y0)--(xn,yn)的角度(β)
如果β>m_maxβ 或β<m_minβ 说明这条线会让前面中的某些点到此线的距离超过限定值.
那么直线只能连接到上一个点(Xn-1,Yn-1).保存(x0,y0,xn-1,yn-1)
并且以(Xn-1,Yn-1)做启点-->执行(1)开始.
否则(也就是:m_minβ<β<m_maxβ )接着进行(8)
(8)计算(xn,yn)允许的从(x0,y0)开始的直线最大角度maxβ,最小角度minβ
如果maxβ<m_maxβ 那么m_maxβ=maxβ
如果minβ>m_maxβ 那么m_minβ=minβ 保证m_minβ m_maxβ对所有已经算过的点有效.
(9)执行到(6)

这种算法应该比较快,因为每个点只计算一次(β,minβ,maxβ)
不用新试一直线就把所有已经算过的点再算一次.

每一点计算中要用到sqrt asin atan这三个运算.不知有没有优化.

还有用float类型和用double类型运算速度是不是一样,大家一般是用什么类型.













19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧