上机实验4:自由曲线和曲面的绘制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);
};