上机实验4:自由曲线和曲面的绘制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学课程实

验 报 告

实验题目 自由曲线和曲面的绘制 班 级 计算081 姓 名 杨 恒 学 号 3080811017 指导教师 胡钢 日 期 2011.6.3

西安理工大学理学院应用数学系

二零一一年春季学期

信息与计算科学专业基础课 Computer Graphics

Report Of course experiment

实验说明

实验目的:掌握自由曲线和曲面(包括Bezier 曲线、曲面和B 样条曲线、曲面)的生成算法思

想,并能上机编程绘制相应的曲线、曲面和利用曲线、曲面进行简单的几何造型设计。

实验地点: 教九楼401 数学系机房

实验要求(Direction): 1.每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它

语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。

实验内容

实验题一

1.1实验题目

上机编写一个能绘制Bezier 曲线和B 样条曲线的通用程序,并调试成功。具体要求为:(1)用户在运行程序时,可以根据提示信息来决定选择绘制Bezier 曲线,还是B 样条曲线;(2)两种曲线控制顶点的个数和坐标值要求可以随机输入(即Bezier 曲线和B 样条曲线的次数和位置可以随机输入);(3)当用户输入控制点的坐标位置后,屏幕上生成曲线的同时显示其特征多边形;且在特征多边形的顶点处输出该顶点坐标;(4)要求在可执行程序后附上运行结果(两种曲线都至少附上一个结果图)。

自由曲线和曲面的绘制

实验

4

1.2实验目的和意义

掌握Bezier曲线和B样条曲线的绘制方法。

1.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)

一、基本思想

(1)Bezier曲线:是由一组折线来定义的,且第一个点和最后一个点在曲线上,第一条和最后一条折线分别表示出曲线在起点和终点处的切线方向。Bezier曲线通常由(n+1)个顶点定义一个n次多项式,曲线上各点参数方程式是

P(t)=∑P i

n

i=0

B i,n(t)

其中,参数t的取值范围是[0,1],i是有序集0~n中的一个整数值,n是多项式次数,也是曲线次数,通常由n+1个顶点确定的曲线为n次曲线。

P i是低i个顶点的坐标值(x或y),B i,n(t)是Berstein多项式,其定义如下:

B i,n(t)=

C n i t i(1−t)n−i

其中

C n i=

n!

i!(n−i)!

(2)B样条曲线:B样条曲线段是由若干条曲线段光滑连接而成的。首先定义B 样条曲线段。

设给定n+1个型值点,用P i表示(i=0,1,2,…,n)。把n次参数曲线段:

P(t)=∑P i

n

i=0

F i,n(t)

叫做B样条曲线段。与Bezier曲线类似,依次用线段连接P i中相邻两个型值点所得的折现多边形称为B特征多边形。

F i,n(t)=1

n!

∑(−1)j C n+1

j(t+n−i−j)n n−i

j=0

B样条函数式中0≤t≤1,i=0,1,…,n。

二、设计步骤

Step1:选择Bezier或B样条曲线绘图;

Step2:若选择用Bezier曲线绘图,输入控制顶点个数,依次输入控制顶点坐标P i;

若选择用B样条曲线绘图,输入B样条曲线段次数,输入控制顶点个数,依次输入控制顶点坐标P i;

Step3:则将t [0,1]区间剖分成m 等分,对于每一个t i ,i=0,1,…,m ,根据式(1)或(2)都可以计算出一个P(t i ),计算所有的P(t i )。

Step4:依次连接每个P(t i ),就得到Bezier 或B 样条曲线。

三、流程图

图 1.1

1.4主程序

#include

N

Y

输入Bezier 顶点个数n 和顶点坐标p

开始

结束

输入choice

Choice==0

输入B 样条曲线段次数,输入顶点个数n 和顶点坐标p

求t i

求P(t i )

依次连接每个P(t i )

画出控制多边形

标出各点坐标

#include

#include"graphics.h"

using namespace std;

#define pi 3.1415926

/************** 二维点类**********************/

class Point

{

public:

double x;

double y;

Point(int x=0,int y=0) //构造函数

{

this->x = x;

this->y = y;

};

void operator=(Point &a) //重载=运算符

{

x=a.x;

y=a.y;

};

Point operator*(double a) //重载*运算符

{

return Point(a*x,a*y);

};

Point operator+(Point a) //重载+运算符

{

return Point(x+a.x,y+a.y);

};

相关文档
最新文档