概述
已知曲线上的三个拟合曲线:
C++:
//Beizer曲线的三个点分别对应ptLeft(左侧点),ptMid(中间的某一点),ptRight(右侧点)
Point2f ptLeft,ptMid,ptRight;
//曲线中的t值,中间点在左右两点的
float locRatio = (ptMid.x-ptLeft.x)/(ptRight.x -ptLeft.x);
//求出控制点位置
Point2f ptControl;
ptControl.x =(ptMid.x -(1-locRatio)*(1-locRatio)*ptLeft.x-locRatio*locRatio*ptRight.x)/2/locRatio/(1-locRatio);
ptControl.y =(ptMid.y -(1-locRatio)*(1-locRatio)*ptLeft.y-locRatio*locRatio*ptRight.y)/2/locRatio/(1-locRatio);
//显示拟合出的曲线
Point2f calcuatePoint;
//以固定固定长度拉伸ptLeft,ptRight之间长度,改变曲线
for (float idx =1;idx <ptRight.x -ptLeft.x;idx++)
{
locRatio = idx/(ptRight.x-ptLeft.x-1);
//这里求出对应的每一处x,对应新的y值
calcuatePoint.x = ptLeft.x +idx;
calcuatePoint.y =(1-locRatio)*(1-locRatio)*ptLeft.y +2*locRatio*(1-locRatio)*ptControl.y +locRatio*locRatio*ptRight.y;
}
Python:
def beizerCurve(pt_left,pt_mid,pt_right):
locRatio = float(pt_mid[0] - pt_left[0]) / float(pt_right[0] - pt_left[0]);
#控制点位置
ptControl=[0,0]
ptControl[0] = (pt_mid[0] - (1 - locRatio) * (
1 - locRatio) * pt_left[0] - locRatio * locRatio * pt_right[0]) / 2 / locRatio / (1 - locRatio);
ptControl[1] = (pt_mid[1] - (1 - locRatio) * (
1 - locRatio) * pt_left[1] - locRatio * locRatio * pt_right[1]) / 2 / locRatio / (1 - locRatio);
curve =[]
for idx in range(pt_right[0] - pt_left[0]):
calcuatePoint = [0, 0]
locRatio = float(idx) / float(pt_right[0] - pt_left[0]-1)
calcuatePoint[0] = pt_left[0] +idx
calcuatePoint[1] = int((1.0-locRatio)**2*pt_left[1]+2*locRatio*(1-locRatio)*ptControl[1]+locRatio**2*pt_right[1])
curve.append(calcuatePoint)
return curve
最后
以上就是满意太阳为你收集整理的Beizer曲线拟合,c++,python实现的全部内容,希望文章能够帮你解决Beizer曲线拟合,c++,python实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复