博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
贝塞尔曲线生成及测试
阅读量:4577 次
发布时间:2019-06-08

本文共 2050 字,大约阅读时间需要 6 分钟。

玩过ps的同学,应该用过一个钢笔工具。

而钢笔产生的就是贝塞尔曲线。还有这里来体验一下:

 

Bezier曲线分为一次/二次/三次/多次贝塞尔曲线,之所以这么分是为了更好的理解其中的内涵。

一次贝塞尔曲线(线性Bezier),实际上就是一条连接两点的直线段。

二次贝塞尔曲线,就是两点间的一条抛物线,利用一个控制点来控制抛物线的形状。
三次贝塞尔曲线,则需要一个起点,一个终点,两个控制点来控制曲线的形状。
实例如下:在的地方体验一下。

一阶曲线。

 

二阶的贝塞尔曲线是这样画出来的。

 

 

而多阶的是这样的。

 

 

那二阶的计算公式,其中 0<=t<=1。

  二阶的计算点的公式: P0*(1-t)^2 + 2*P1*t(1-t) + P2*t^2 =P,其中P0为起始点,P1为控制点,P2为终点。那我们用matlab仿真,代码如下:

%% 起始点startx=1;starty=1;%% 终止点endx=10;endy=0;%% 控制点cont1x=5;cont1y=1;%% 生成曲线pointnum=100;%步数t=1/(pointnum-1);for i=1:pointnum-1    x= startx*(1-i*t)^2 + cont1x*2*i*t*(1-i*t) + endx*(i*t)^2;    y= starty*(1-i*t)^2 + cont1y*2*i*t*(1-i*t) + endy*(i*t)^2;    hold on;    plot(x,y,'.');endplot(startx,starty,'*')plot(endx,endy,'*')plot(cont1x,cont1y,'*')

 

 四个点的话就是两个控制点 p1,p2,另外两个就是起点和终点p0,p3。

公式为: P = P0*(1-t)^3 +3*P1*t*(1-t)^2+3*P2*(1-t)*t^2+P3*t^3 。

 

C++代码如下:

struct Point_Float{    float x;    float y;};float MetaComputing(float p0, float p1, float p2, float p3, float t){    // 方法一:    float a, b, c;    float tSquare, tCube;    // 计算多项式系数    c = 3.0 * (p1 - p0);    b = 3.0 * (p2 - p1) - c;    a = p3 - b - c - p0;    // 计算t位置的点    tSquare = t * t;    tCube   = t * tSquare;    return (a * tCube) + (b * tSquare) + (c * t) + p0;    // 方法二: 原始的三次方公式    //  float n = 1.0 - t;    //  return n*n*n*p0 + 3.0*p1*t*n*n + 3.0*p2*t*t*n + p3*t*t*t;}float MetaComputing(float p0, float p1, float p2, float t){    // 方法一:    float a, b, c;    float tmin;    // 计算多项式系数    c = p0;    b = 2.0 * p1;    a = p2;    // 计算t位置的点    tmin = 1-t;    return (tmin*tmin*c) + (tmin*t*b) + (t*t*a);}Point_Float PointOnTrieBezier(Point_Float* cp, float t){    Point_Float tPoint;    tPoint.x = MetaComputing(cp[0].x, cp[1].x, cp[2].x, cp[3].x, t);    tPoint.y = MetaComputing(cp[0].y, cp[1].y, cp[2].y, cp[3].y, t);    return tPoint;}Point_Float PointOnCubeBezier(Point_Float* cp, float t){    Point_Float tPoint;    tPoint.x = MetaComputing(cp[0].x, cp[1].x, cp[2].x, t);    tPoint.y = MetaComputing(cp[0].y, cp[1].y, cp[2].y, t);    return tPoint;}

 

 

参考资料:    

转载于:https://www.cnblogs.com/TIANHUAHUA/p/8425190.html

你可能感兴趣的文章
android中如何在代码中直接设置View的layout_weight属性
查看>>
hdu 1853 Cyclic Tour(费用流OR二分图最佳匹配,5级)
查看>>
js 对url进行某个参数的删除,并返回url
查看>>
Windows7装Linux虚拟机
查看>>
SQL 操作结果集 -并集、差集、交集、结果集排序
查看>>
linux上搭建nginx+php+mysql环境详细讲解
查看>>
RemoveDuplicatesFromSortedArrayI II,移除有序数组里的重复元素以及移除数组里的某个元素...
查看>>
Minimum Depth of Binary Tree,求树的最小深度
查看>>
解决Web部署 svg/woff/woff2字体 404错误
查看>>
fiddler 抓取 nodejs
查看>>
1.Nginx服务应用
查看>>
MySQL基础
查看>>
凹凸贴图与法线贴图
查看>>
sqlserver跨服务器数据库sql语句
查看>>
设计模式-结构型模式,外观模式(6)
查看>>
Trie模版
查看>>
2018HDU多校训练-3-Problem F. Grab The Tree
查看>>
2016012032四则运算网页版结对项目报告
查看>>
边工作边刷题:70天一遍leetcode: day 45
查看>>
淘宝专业版改基础版方法
查看>>