计算机图形学(七)Bezier(贝塞尔)曲线讲解与源代码
2017-04-21 12:57
471 查看
源码下载:点我下载
“贝赛尔曲线”是由法国数学家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阶曲线:
代码:
实现的图片
其中点击ADD可以增加点,最多99个,点击MOVE可以移动点。
代码很简单,理解也不难。
如果有什么问题,还望指出。谢谢
“贝赛尔曲线”是由法国数学家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阶曲线:
代码:
typedef struct { double x; double y; }DPoint; DPoint points[100];
void CBezierView::DrawBzier(DPoint * p) { if (n<= 0) return; if((p .x<p[0].x+1)&&(p .x>p[0].x-1)&&(p .y<p[0].y+1)&&(p .y>p[0].y-1)) { pDC->SetPixel(p[0].x, p[0].y, RGB(0,0,255)); return; } DPoint *p1; p1 = new DPo bcaf int[n+1]; int i, j; p1[0] = p[0]; for(i=1; i<=n; i++) { for(j=0; j<=n-i;j++) { p[j].x = (p[j].x + p[j+1].x)/2; p[j].y = (p[j].y + p[j+1].y)/2; } p1[i] = p[0]; } DrawBzier(p); DrawBzier(p1); delete p1; }可以看出代码是使用递归的算法,找中点,然后在达到
if((p .x<p[0].x+1)&&(p .x>p[0].x-1)&&(p .y<p[0].y+1)&&(p .y>p[0].y-1))的情况下留下该点,然后当所有的点都出来之后就是贝赛尔曲线了。
实现的图片
其中点击ADD可以增加点,最多99个,点击MOVE可以移动点。
代码很简单,理解也不难。
如果有什么问题,还望指出。谢谢
相关文章推荐
- 计算机图形学(二)中点画圆算法讲解与源代码
- 计算机图形学(五)线段的中点分割裁剪算法讲解与源代码
- 计算机图形学(六)多边形裁剪Sutherland-Hodgeman算法讲解与源代码
- 计算机图形学(八)几何图形变换讲解与源代码
- 计算机图形学(三)扫描线多边形填充算法讲解与源代码
- 计算机图形学 学习笔记(十):曲线曲面(二):Bezier 曲线与曲面
- 计算机图形学 学习笔记(十一):曲线曲面(三):B样条 曲线与曲面
- 计算几何与计算机图形学方面的一些资源及源代码http://www.justdone.cn/index.php/uid-2-action-viewspace-itemid-72
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_5_其他曲线
- 计算几何与计算机图形学方面的一些资源及源代码
- 计算几何与计算机图形学方面的一些资源及源代码
- 计算机图形学 学习笔记(九):曲线曲面(一):参数曲线、参数几何代数形式
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法
- 计算几何与计算机图形学方面的一些资源及源代码
- [真格邦]JAVA实战之人与计算机对战-石头剪刀布游戏讲解、源代码
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_3_椭圆生成算法
- 计算机图形学(三)_图元的属性_5_曲线属性
- 数学图形(1.47)贝塞尔(Bézier)曲线
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_4_中点椭圆算法(上)
- 计算机图形学-基于OpenGL的绘制空间曲线