已知曲线上的三个拟合曲线:
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