ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:276.52KB ,
资源ID:11990752      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11990752.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(自由曲线和曲面的绘制.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

自由曲线和曲面的绘制.docx

1、自由曲线和曲面的绘制信息与计算科学专业基础课Computer Graphics Report Of course experiment 计算机图形学课程实验 报 告实验题目 自由曲线和曲面的绘制 班 级 计算091 姓 名 张 阳 学 号 3090811019 指导教师 胡 钢 日 期 2012-6-17 西安理工大学理学院应用数学系二0一二年春季学期实验4自由曲线和曲面的绘制实验说明实验目的:掌握自由曲线和曲面(包括Bezier曲线、曲面和B样条曲线、曲面)的生成算法思想,并能上机编程绘制相应的曲线、曲面和利用曲线、曲面进行简单的几何造型设计。实验地点: 教九楼401 数学系机房实验要求(D

2、irection): 1.每个学生单独完成;2.开发语言为TurboC或C+,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。实验内容实验题一1.1实验题目上机编写一个能绘制Bezier曲线和B样条曲线的通用程序,并调试成功。具体要求为:(1)用户在运行程序时,可以根据提示信息来决定选择绘制Bezier曲线,还是B样条曲线;(2)两种曲线控制顶点的个数和坐标值要求可以随机输入(即Bezier曲线和B样条曲线的次数和位置可以随机输入

3、);(3)当用户输入控制点的坐标位置后,屏幕上生成曲线的同时显示其特征多边形;且在特征多边形的顶点处输出该顶点坐标;(4)要求在可执行程序后附上运行结果(两种曲线都至少附上一个结果图)。1.2实验目的和意义掌握Bezier曲线和B样条曲线的绘制方法。1.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)一、基本思想(1)Bezier曲线:是由一组折线来定义的,且第一个点和最后一个点在曲线上,第一条和最后一条折线分别表示出曲线在起点和终点处的切线方向。Bezier曲线通常由(n+1)个顶点定义一个n次多项式。(2)B样条曲线:B样条曲线段是由若干条曲线段光滑连接而成的。首先定义B样条曲线段

4、。设给定n+1个型值点,用表示(i=0,1,2,n)。把n次参数曲线段:叫做B样条曲线段。与Bezier曲线类似,依次用线段连接中相邻两个型值点所得的折现多边形称为B特征多边形。二、设计步骤Step1:选择Bezier或B样条曲线绘图;Step2:若选择用Bezier曲线绘图,输入控制顶点个数,依次输入控制顶点坐标;若选择用B样条曲线绘图,输入B样条曲线段次数,输入控制顶点个数,依次输入控制顶点坐标;Step3:则将t 0,1区间剖分成m等分,对于每一个ti,i=0,1,m,根据式(1)或(2)都可以计算出一个P(ti),计算所有的P(ti)。Step4:依次连接每个P(ti),就得到Bezi

5、er或B样条曲线1.4主程序#include#include#include#include#includegraphics.h/using namespace std;#define pi 3.1415926/* 二维 点类 */class Pointpublic: 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 Poin

6、t(a*x,a*y); Point operator+(Point a) /重载+运算符 return Point(x+a.x,y+a.y); void operator+=(Point a) /重载+=运算符 x+=a.x; y+=a.y; /* 基本的函数 */求阶乘long int Factorial(int n) int i,sum=1; if(n=0) return 1; for(i=2;i=n;i+) sum *= i; return sum;/求Bernstein基函数double Bernstein(int i,int n,double t) return (double)Fa

7、ctorial(n)/Factorial(i)/Factorial(n-i)*pow(t,i)*pow(1-t,n-i);/求B_SplineBase基函数double B_SplineBase(int i,int n,double t) double sum = 0; int j; for(j=0;j=n-i;j+) sum+=pow(-1,j)*Factorial(n+1)/Factorial(j)/Factorial(n+1-j)*pow(t+n-i-j,n); return sum/Factorial(n);/* 曲线 */求Bezier曲线void Bezier(Point p,in

8、t pn,int m) /将t【0,1】分成多少等分 m double h = 1.0/m; double t = 0; int i,j; int *pB = (int *)malloc(sizeof(int)*(2*m+2); Point ptemp(0,0); for(j=0;j=2*m+1;j+=2,t+=h) ptemp.x = 0; ptemp.y = 0; for(i=0;ipn;i+) ptemp += pi*Bernstein(i,pn-1,t); pBj = ptemp.x; pBj+1 = ptemp.y; drawpoly(m+1,pB);/求B样条曲线void B_Sp

9、line(Point p,int pn,int n,int m) /pn为p中点个数,n为次数,m为t的等分数 double h = 1.0/m; double t = 0; int i,j,k; int *pB = (int *)malloc(sizeof(int)*(2*m+2); Point ptemp(0,0); for(k=0;k=pn-n-1;k+) /是由pn-n个n次拼接而成 t = 0; for(j=0;j=2*m+1;j+=2,t+=h) ptemp.x = 0; ptemp.y = 0; for(i=0;i=n;i+) ptemp += pk+i*B_SplineBase

10、(i,n,t); pBj = ptemp.x; pBj+1 = ptemp.y; drawpoly(m+1,pB); /画控制多边形void drawControlPoly(Point *p,int pn) setlinestyle(DASHED_LINE,0,0); int i; char str60; for(i=0;ipn-1;i+) line(pi.x,pi.y,pi+1.x,pi+1.y); sprintf(str,%c%d%c%d%c,(,(int)pi.x,(int)pi.y,); outtextxy(pi.x,pi.y,str); sprintf(str,%c%d%c%d%c,

11、(,(int)pi.x,(int)pi.y,); outtextxy(pi.x,pi.y,str); setlinestyle(SOLID_LINE,0,0);void main() int gd,gm,i,choose,n,pn; char str60; detectgraph(&gd,&gm); /* 测试曲线 */ setcolor(RED); /Point p = Point(0,0),Point(100,100),Point(200,100),Point(300,0); cout*endl; cout* 输入 0: Bezier曲线 endl; cout* 输入 1: B样条 曲线

12、choose; if(choose=1) break; else if(choose=0) break; cout输入错误,请重新输入:; if(choose=1) coutn; coutpn; Point *p = new Pointpn; cout输入控制顶点:endl; for(i=0;ipn;i+) cout输入pi+1pi.xpi.y; initgraph(&gd,&gm,); /图形模式初始化 setcolor(GREEN); if(choose=0) Bezier(p,pn,100); /画Bezier曲线 else B_Spline(p,pn,n,100); /画B样条曲线 s

13、etcolor(WHITE); drawControlPoly(p,pn); /画出控制多边形 settextstyle(0,0,2); if(choose=0) sprintf(str,%s%d%s,您所画的是: ,pn-1, 次Bezier曲线); outtextxy(ppn-1.x+200,p0.y,str); else sprintf(str,%s%d%s,您所画的是: ,n, 次B样条曲线); outtextxy(ppn-1.x+200,p0.y,str); sprintf(str,%s%d,您所用控制顶点个数为: ,pn); outtextxy(ppn-1.x+200,p0.y+t

14、extheight(2),str); outtextxy(ppn-1.x+200,p0.y+2*textheight(2),控制顶点坐标分别为); for(i=0;ipn;i+) sprintf(str,%d%s%d,(int)pi.x, ,(int)pi.y); outtextxy(ppn-1.x+230,p0.y+(i+3)*textheight(2),str); getch(); closegraph();1.5运行结果图实验题二2.1实验题目1).利用Bezier曲线及其拼接技术设计花瓶几何图案或汽车图案(注意:使用Bezier曲线时曲线的次数不要超过10次)。要求:(1)此题中Bez

15、ier曲线的生成利用de Casteljau算法,不能用Bezier曲线的定义;(2)屏幕上生成花瓶几何图案曲线的同时显示其特征控制多边形;且在特征多边形的顶点处输出该顶点坐标;(3)花瓶几何图案的具体形状可以自行设计,但运行结果图至少包括2个花瓶图案。运行结果参考图如下所示。2).利用二次或三次Bezier曲线(或B样条曲线)技术绘制每个同学自己的中文名字图案。要求:(1)中文汉字的笔画要求具有一定的宽度,笔画区域可以填充也可以不填充;(2)中文汉字的字体(如宋体、楷体等)可以自己设定。参考样例的运行结果如下图所示。2.2实验目的和意义掌握并通过程序实现Bezier曲线和B样条曲线的C0级拼

16、接。2.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)一、算法思想 利用Bezier曲线和B样条曲线的C0级拼接实现复杂图形的绘制。二、设计步骤 Step1:输入构成花瓶或车曲线的控制顶点。 Step2:画花瓶:利用de Casteljau算法生成的Bezier曲线逐段绘制花瓶图案。 画汽车:利用B样条曲线逐段绘制汽车图案。 Step3:画出控制多边形。 Step4:标出控制多边形顶点坐标。2.4主程序(1)汽车图案#include#include#include#include#includegraphics.h#define pi 3.1415926class Pointpubl

17、ic: 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); void operator+=(Point a) /重载+=运算符 x+=a.x; y+=a.y; /* 基本的函数

18、*/求阶乘long int Factorial(int n) int i,sum=1; if(n=0) return 1; for(i=2;i=n;i+) sum *= i; return sum;/求Bernstein基函数double Bernstein(int i,int n,double t) return (double)Factorial(n)/Factorial(i)/Factorial(n-i)*pow(t,i)*pow(1-t,n-i);/求B_SplineBase基函数double B_SplineBase(int i,int n,double t) double sum

19、= 0; int j; for(j=0;j=n-i;j+) sum+=pow(-1,j)*Factorial(n+1)/Factorial(j)/Factorial(n+1-j)*pow(t+n-i-j,n); return sum/Factorial(n);/* 曲线 */求Bezier曲线void Bezier(Point p,int n,int m) /将t【0,1】分成多少等分 m double h = 1.0/m; double t = 0; int i,j; int *pB = (int *)malloc(sizeof(int)*(2*m+2); Point ptemp(0,0);

20、 for(j=0;j=2*m+1;j+=2,t+=h) ptemp.x = 0; ptemp.y = 0; for(i=0;i=n;i+) ptemp += pi*Bernstein(i,n,t); pBj = ptemp.x; pBj+1 = ptemp.y; drawpoly(m+1,pB);/利用迪卡斯递推算法实现Bezier曲线void BezierD(Point p,int n,int m) Point *pp = (Point *)malloc(sizeof(Point)*(n+1); /用于循环 /将t【0,1】分成多少等分 m double h = 1.0/m; double

21、t = 0; int i,j,k; int *pB = (int *)malloc(sizeof(int)*(2*m+2); for(j=0;j=2*m+1;j+=2,t+=h) for(i=0;i0;i-) for(k=0;ki;k+) ppk = (ppk*(1-t) + (ppk+1*t); pBj = pp0.x; pBj+1 = pp0.y; drawpoly(m+1,pB);/求B样条曲线void B_Spline(Point p,int pn,int n,int m) /pn为p中点个数,n为次数,m为t的等分数 double h = 1.0/m; double t = 0; i

22、nt i,j,k; int *pB = (int *)malloc(sizeof(int)*(2*m+2); Point ptemp(0,0); for(k=0;k=pn-n-1;k+) /是由pn-n个n次拼接而成 t = 0; for(j=0;j=2*m+1;j+=2,t+=h) ptemp.x = 0; ptemp.y = 0; for(i=0;i=n;i+) ptemp += pk+i*B_SplineBase(i,n,t); pBj = ptemp.x; pBj+1 = ptemp.y; drawpoly(m+1,pB); void Car() int i; char str60;

23、Point p = Point(210,290),Point(210,350),Point(210,410),Point(310,410),Point(375,337), Point(417,337),Point(480,410),Point(670,410),Point(730,337),Point(770,337), Point(830,410),Point(935,410),Point(935,350),Point(935,290),Point(830,290),Point(730,175),Point(625,175),Point(520,175),Point(470,232),Poi

24、nt(420,290),Point(315,290),Point(210,290),Point(210,350) ; /画车身(蓝色) setcolor(BLUE); B_Spline(p,23,2,100); /画轮子 setcolor(GREEN); circle(395,410,60); circle(750,410,60); /画控制点(红色) setcolor(RED); moveto(p0.x,p0.y); for(i=1;i23;i+) lineto(pi.x,pi.y); circle(pi.x,pi.y,4); sprintf(str,%c%d%c%d%c,(,(int)pi

25、.x,(int)pi.y,); outtextxy(pi.x,pi.y,str); lineto(p0.x,p0.y); circle(p0.x,p0.y,4); sprintf(str,%c%d%c%d%c,(,(int)p0.x,(int)p0.y,); outtextxy(p0.x,p0.y,str);void main() int gd,gm,choose; detectgraph(&gd,&gm); initgraph(&gd,&gm,); /图形模式初始化 Car(); getch(); closegraph();(2)画姓名#includegraphics.h#includema

26、th.h#includevoid main() float x0=145,y0=125,x1=160,y1=110,x2=175,y2=90,x3=180,y3=60; float x4=145,y4=145,x5=165,y5=185,x6=190,y6=205,x7=200,y7=210; float z1=345,w1=50,z2=335,w2=75,z3=320,w3=100;/阳 float z4=330,w4=115,z5=360,w5=120,z6=330,w6=155; float z7=323,w7=154,z8=310,w8=145; float n0=100,m0=155,n1=100,m1=165,n2=100,m2=200,n3=90,m3=225; float n4=85,m4=223,n5=80,m5=222,n6=60,m6=210; int gdriver=DETECT,gmode; int x,y;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1