当前位置:   article > 正文

贝塞尔曲线-曲线拟合_贝塞尔曲线拟合

贝塞尔曲线拟合

1、贝塞尔曲线生成原理

生成过程如下图所示:


具体步骤

  1. 在二维平面内选三个不同的点(起点A,中间点B,终点C)并依次用线段连接
  2. 在线段AB和BC上按比例分割找到新的起点和中间点:D、E两点,使得AD/AB=BE/BC
  3. 连接DE,并在DE上找到新的起点F点,EC上找到新的中间点G点,使其满足DF/DE=EG/EC
  4. 重复步骤1、2、3,找出符合上述条件的所有点,直到新的起点和终点C重合或者中间点和终点C重合(完全重合或者距离小于某个设定阈值)时结束递归
  5. 连接上述所有符合条件的点A、D、F、H、J...C,所形成的曲线就是贝塞尔曲线。

上述示意图为二阶贝塞尔曲线形成过程,高阶贝塞尔曲线过程类似,可以使用递归实现。

贝塞尔曲线生成代码如下:

  1. class Bezier:
  2. def __init__(self,points,baseRatio=1e-5):
  3. self.curve = []
  4. self.ratio = baseRatio
  5. self.Points = points
  6. def findP(self): # start,end:矩阵:1*2,1*2。更新p0,p1。ratio:比例:[0,1]
  7. self.curve.append(self.Points[0])
  8. self.ratio=self.ratio+1e-2#使raito非固定值,否则递归深度过深,容易栈溢出
  9. # 寻找pNew
  10. for ii in range(1, len(self.Points)):
  11. '''
  12. * a(x0,y0)
  13. .* b(x,y)
  14. ...
  15. ....
  16. ....* c(x1,y1)
  17. (x-x0)/(x1-x0)=0.4-->x=(x1-x0)*0.4+x0
  18. (y-y0)/(y1-y0)=0.4-->y=(y1-y0)*0.4+y0
  19. '''
  20. pNew = [(self.Points[ii][0] - self.Points[ii - 1][0]) * self.ratio + self.Points[ii - 1][0],
  21. (self.Points[ii][1] - self.Points[ii - 1][1]) * self.ratio + self.Points[ii - 1][1]]
  22. # 更新
  23. self.Points[ii - 1] = pNew
  24. if np.sqrt(sum(np.power((self.Points[-1][0] - self.Points[0][0],self.Points[-1][1] - self.Points[0][1]), 2)))>1e-5:#新的起点和终点重合时,结束递归
  25. self.findP()
  26. def run(self):
  27. self.findP()
  28. self.curve.append(self.Points[-1])
  29. if __name__=='__main__':
  30. Points = [[1, 1], [2, 1], [2, 2], [1, 2]]
  31. xx = Bezier(p)
  32. xx.run()
  33. xx.curve = np.array(xx.curve)
  34. plt.figure(1)
  35. plt.plot(xx.curve[:,0],xx.curve[:,1])
  36. plt.show()

1.1贝塞尔拟合曲线

简单的贝塞尔曲线拟合效果如下

如下图所示,点A、点C分别为起点和终点,"中间"点B称为控制点。

通过调整控制点B的位置,可以调整曲线的曲率以及方向(凸或者凹),如下图所示,其中红点为控制点

                          

 用贝塞尔曲线拟合,需要注意控制点的选择,还要做平滑优化曲线处理(待完成),如下图所示

        

 2、用贝塞尔曲线做路径规划

待完成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/812088
推荐阅读
相关标签
  

闽ICP备14008679号