计算机图形学(七)Bezier(贝塞尔)曲线讲解与源代码

源码下载:点我下载

“贝赛尔曲线”是由法国数学家Pierre Bézier所发明,由此为计算机矢量图形学奠定了基础。它的主要意义在于无论是直线或曲线都能在数学上予以描述。

算法的基本原理:

 

贝塞尔曲线贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条线是虚拟的,中间与贝塞尔曲线交叉,两端是控制端点。移动两端的端点时贝塞尔曲线改变曲线的曲率(弯曲的程度);移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做均匀移动。注意,贝塞尔曲线上的所有控制点、节点均可编辑。这种“智能化”的矢量线条为艺术家提供了一种理想的图形编辑与创造的工具。
 

以下公式中:B(t)为t时间下 点的坐标;

P0为起点,Pn为终点,Pi为控制点

一阶贝塞尔曲线(线段):

 

意义:由 P0 至 P1 的连续点, 描述的一条线段

二阶贝塞尔曲线(抛物线):

 

原理:由 P0 至 P1 的连续点 Q0,描述一条线段。 
由 P1 至 P2 的连续点 Q1,描述一条线段。 
由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。

经验:P1-P0为曲线在P0处的切线。

三阶贝塞尔曲线:

通用公式:

 

高阶贝塞尔曲线:

4阶曲线:

5阶曲线:

代码:

 

 
  1. typedef struct

  2. {

  3. double x;

  4. double y;

  5. }DPoint;

  6. DPoint points[100];

 
  1. void CBezierView::DrawBzier(DPoint * p)

  2. {

  3. if (n<= 0)

  4. return;

  5. if((p[n].x<p[0].x+1)&&(p[n].x>p[0].x-1)&&(p[n].y<p[0].y+1)&&(p[n].y>p[0].y-1))

  6. {

  7. pDC->SetPixel(p[0].x, p[0].y, RGB(0,0,255));

  8. return;

  9. }

  10. DPoint *p1;

  11. p1 = new DPoint[n+1];

  12. int i, j;

  13. p1[0] = p[0];

  14. for(i=1; i<=n; i++)

  15. {

  16. for(j=0; j<=n-i;j++)

  17. {

  18. p[j].x = (p[j].x + p[j+1].x)/2;

  19. p[j].y = (p[j].y + p[j+1].y)/2;

  20. }

  21. p1[i] = p[0];

  22. }

  23. DrawBzier(p);

  24. DrawBzier(p1);

  25. delete p1;

  26. }

可以看出代码是使用递归的算法,找中点,然后在达到

if((p[n].x<p[0].x+1)&&(p[n].x>p[0].x-1)&&(p[n].y<p[0].y+1)&&(p[n].y>p[0].y-1))

的情况下留下该点,然后当所有的点都出来之后就是贝赛尔曲线了。

 

实现的图片

其中点击ADD可以增加点,最多99个,点击MOVE可以移动点。

代码很简单,理解也不难。

如果有什么问题,还望指出。谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值