自由曲线和曲面的绘制Word格式文档下载.docx

上传人:b****2 文档编号:4460815 上传时间:2023-05-03 格式:DOCX 页数:35 大小:276.52KB
下载 相关 举报
自由曲线和曲面的绘制Word格式文档下载.docx_第1页
第1页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第2页
第2页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第3页
第3页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第4页
第4页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第5页
第5页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第6页
第6页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第7页
第7页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第8页
第8页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第9页
第9页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第10页
第10页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第11页
第11页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第12页
第12页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第13页
第13页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第14页
第14页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第15页
第15页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第16页
第16页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第17页
第17页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第18页
第18页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第19页
第19页 / 共35页
自由曲线和曲面的绘制Word格式文档下载.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

自由曲线和曲面的绘制Word格式文档下载.docx

《自由曲线和曲面的绘制Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《自由曲线和曲面的绘制Word格式文档下载.docx(35页珍藏版)》请在冰点文库上搜索。

自由曲线和曲面的绘制Word格式文档下载.docx

且在特征多边形的顶点处输出该顶点坐标;

(4)要求在可执行程序后附上运行结果(两种曲线都至少附上一个结果图)。

1.2实验目的和意义

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

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

一、基本思想

(1)Bezier曲线:

是由一组折线来定义的,且第一个点和最后一个点在曲线上,第一条和最后一条折线分别表示出曲线在起点和终点处的切线方向。

Bezier曲线通常由(n+1)个顶点定义一个n次多项式。

(2)B样条曲线:

B样条曲线段是由若干条曲线段光滑连接而成的。

首先定义B样条曲线段。

设给定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),就得到Bezier或B样条曲线

1.4主程序

#include<

iostream.h>

math.h>

malloc.h>

stdio.h>

#include"

graphics.h"

//usingnamespacestd;

#definepi3.1415926

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

classPoint

{

public:

doublex;

doubley;

Point(intx=0,inty=0)//构造函数

{

this->

x=x;

y=y;

}

voidoperator=(Point&

a)//重载=运算符

x=a.x;

y=a.y;

Pointoperator*(doublea)//重载*运算符

returnPoint(a*x,a*y);

Pointoperator+(Pointa)//重载+运算符

returnPoint(x+a.x,y+a.y);

voidoperator+=(Pointa)//重载+=运算符

x+=a.x;

y+=a.y;

}

/*

********************基本的函数*************************

*/

//求阶乘

longintFactorial(intn)

inti,sum=1;

if(n==0)

return1;

for(i=2;

i<

=n;

i++)

sum*=i;

returnsum;

//求Bernstein基函数

doubleBernstein(inti,intn,doublet)

return(double)Factorial(n)/Factorial(i)/Factorial(n-i)*pow(t,i)*pow(1-t,n-i);

//求B_SplineBase基函数

doubleB_SplineBase(inti,intn,doublet)

doublesum=0;

intj;

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);

returnsum/Factorial(n);

********************曲线*************************

//求Bezier曲线

voidBezier(Pointp[],intpn,intm)

//将t【0,1】分成多少等分m

doubleh=1.0/m;

doublet=0;

inti,j;

int*pB=(int*)malloc(sizeof(int)*(2*m+2));

Pointptemp(0,0);

=2*m+1;

j+=2,t+=h)

ptemp.x=0;

ptemp.y=0;

for(i=0;

pn;

{

ptemp+=p[i]*Bernstein(i,pn-1,t);

}

pB[j]=ptemp.x;

pB[j+1]=ptemp.y;

drawpoly(m+1,pB);

//求B样条曲线

voidB_Spline(Pointp[],intpn,intn,intm)//pn为p中点个数,n为次数,m为t的等分数

inti,j,k;

for(k=0;

k<

=pn-n-1;

k++)//是由pn-n个n次拼接而成

t=0;

for(j=0;

ptemp.x=0;

ptemp.y=0;

for(i=0;

{

ptemp+=p[k+i]*B_SplineBase(i,n,t);

}

pB[j]=ptemp.x;

pB[j+1]=ptemp.y;

drawpoly(m+1,pB);

//画控制多边形

voiddrawControlPoly(Point*p,intpn)

setlinestyle(DASHED_LINE,0,0);

inti;

charstr[60];

for(i=0;

pn-1;

line(p[i].x,p[i].y,p[i+1].x,p[i+1].y);

sprintf(str,"

%c%d%c%d%c"

'

('

(int)p[i].x,'

(int)p[i].y,'

)'

);

outtextxy(p[i].x,p[i].y,str);

sprintf(str,"

outtextxy(p[i].x,p[i].y,str);

setlinestyle(SOLID_LINE,0,0);

voidmain()

intgd,gm,i,choose,n,pn;

detectgraph(&

gd,&

gm);

/**********************测试曲线************************/

setcolor(RED);

//Pointp[]={Point(0,0),Point(100,100),Point(200,100),Point(300,0)};

cout<

<

"

***********************************"

endl;

***输入0:

Bezier曲线"

<

***输入1:

B样条曲线"

while

(1)

cin>

>

choose;

if(choose==1)

break;

elseif(choose==0)

cout<

输入错误,请重新输入:

;

if(choose==1)

输入B样条曲线段次数:

cin>

n;

cout<

输入控制顶点个数:

"

Point*p=newPoint[pn];

输入控制顶点:

输入p"

i+1<

:

p[i].x>

p[i].y;

initgraph(&

gm,"

//图形模式初始化

setcolor(GREEN);

if(choose==0)

Bezier(p,pn,100);

//画Bezier曲线

else

B_Spline(p,pn,n,100);

//画B样条曲线

setcolor(WHITE);

drawControlPoly(p,pn);

//画出控制多边形

settextstyle(0,0,2);

%s%d%s"

"

您所画的是:

pn-1,"

次Bezier曲线"

outtextxy(p[pn-1].x+200,p[0].y,str);

n,"

次B样条曲线"

%s%d"

您所用控制顶点个数为:

pn);

outtextxy(p[pn-1].x+200,p[0].y+textheight("

2"

),str);

outtextxy(p[pn-1].x+200,p[0].y+2*textheight("

),"

控制顶点坐标分别为"

%d%s%d"

(int)p[i].x,"

(int)p[i].y);

outtextxy(p[pn-1].x+230,p[0].y+(i+3)*textheight("

getch();

closegraph();

1.5运行结果图

实验题二

2.1实验题目

1).利用Bezier曲线及其拼接技术设计花瓶几何图案或汽车图案(注意:

使用Bezier曲线时曲线的次数不要超过10次)。

要求:

(1)此题中Bezier曲线的生成利用deCasteljau算法,不能用Bezier曲线的定义;

(2)屏幕上生成花瓶几何图案曲线的同时显示其特征控制多边形;

(3)花瓶几何图案的具体形状可以自行设计,但运行结果图至少包括2个花瓶图案。

运行结果参考图如下所示。

2).利用二次或三次Bezier曲线(或B样条曲线)技术绘制每个同学自己的中文名字图案。

(1)中文汉字的笔画要求具有一定的宽度,笔画区域可以填充也可以不填充;

(2)中文汉字的字体(如宋体、楷体等)可以自己设定。

参考样例的运行结果如下图所示。

2.2实验目的和意义

掌握并通过程序实现Bezier曲线和B样条曲线的C0级拼接。

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

一、算法思想

利用Bezier曲线和B样条曲线的C0级拼接实现复杂图形的绘制。

Step1:

输入构成花瓶或车曲线的控制顶点。

Step2:

画花瓶:

利用deCasteljau算法生成的Bezier曲线逐段绘制花瓶图案。

画汽车:

利用B样条曲线逐段绘制汽车图案。

Step3:

画出控制多边形。

Step4:

标出控制多边形顶点坐标。

2.4主程序

(1)汽车图案

}voidoperator=(Point&

}Pointoperator*(doublea)//重载*运算符

voidBezier(Pointp[],intn,intm)

ptemp+=p[i]*Bernstein(i,n,t);

drawpoly(m+1,pB);

//利用迪卡斯递推算法实现Bezier曲线

voidBezierD(Pointp[],intn,intm)

Point*pp=(Point*)malloc(sizeof(Point)*(n+1));

//用于循环

pp[i]=p[i];

for(i=n;

i>

0;

i--)

for(k=0;

i;

k++)

pp[k]=(pp[k]*(1-t))+(pp[k+1]*t);

pB[j]=pp[0].x;

pB[j+1]=pp[0].y;

voidCar()

Pointp[]=

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),Point(420,290),

Point(315,290),Point(210,290),Point(210,350)

};

//画车身(蓝色)

setcolor(BLUE);

B_Spline(p,23,2,100);

//画轮子

circle(395,410,60);

circle(750,410,60);

//画控制点(红色)

moveto(p[0].x,p[0].y);

for(i=1;

23;

lineto(p[i].x,p[i].y);

circle(p[i].x,p[i].y,4);

lineto(p[0].x,p[0].y);

circle(p[0].x,p[0].y,4);

(int)p[0].x,'

(int)p[0].y,'

outtextxy(p[0].x,p[0].y,str);

{

intgd,gm,choose;

Car();

getch();

(2)画姓名

math.h"

floatx0=145,y0=125,x1=160,y1=110,x2=175,y2=90,x3=180,y3=60;

floatx4=145,y4=145,x5=165,y5=185,x6=190,y6=205,x7=200,y7=210;

floatz1=345,w1=50,z2=335,w2=75,z3=320,w3=100;

//阳

floatz4=330,w4=115,z5=360,w5=120,z6=330,w6=155;

floatz7=323,w7=154,z8=310,w8=145;

floatn0=100,m0=155,n1=100,m1=165,n2=100,m2=200,n3=90,m3=225;

floatn4=85,m4=223,n5=80,m5=222,n6=60,m6=210;

intgdriver=DETECT,gmode;

intx,y;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2