我是靠谱客的博主 满意太阳,最近开发中收集的这篇文章主要介绍Beizer曲线拟合,c++,python实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述
已知曲线上的三个拟合曲线:

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实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部