1558.计算机图形学实验报告_第1页
1558.计算机图形学实验报告_第2页
1558.计算机图形学实验报告_第3页
1558.计算机图形学实验报告_第4页
1558.计算机图形学实验报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 计算机图形学实验报告学 院:计算机科学学院 班 级: 学 号: 学生姓名: 指导教师: 2008年1月目录实验一 基本图元的绘制一、实验目的与要求-2二、实验内容-2(一)、简单dda法画直线-2(二)、bresenham直线生成算法-4(三)、bresenham画圆算法-7(四)、角度dda法产生圆弧-9实验二 自由曲线一、实验目的与要求-11二、实验内容-11(一)、三次参数样条曲线段-11(二)、三次bezier曲线段-13(三)、三次b样条曲线段-15图形学、cad二次开发及动画课程设计-17实验一 基本图元的绘制一、实验目的与要求 (1)熟悉turbo c下图形编辑环境 (2)实现

2、bresenham算法画直线(3) 设计dda直线生成算法的实现程序(4)设计bresenham画圆算法的实现程序(5)设计角度dda法产生圆弧的实现程序二、实验内容(一)、简单dda法画直线(1)、算法:在x或y变化大的方向,即计长方向上,步长始终为1,而另一方向上的步长则小于1,其是否走步,视其有无整数部分溢出,也即:若 |k|1,则取xinc =1, yinc =k, yi+1 = yi k ;若 |k|1,则取yinc =1, xinc =1/k, yi+1 = yi 1/k (2)、源程序#include #include #include int addline(int k,int

3、 x1,int y1,int x2,int color) int curx,cury,k1;curx = x1;cury = y1;k1 = k;k1 = abs(k1);if (k1 = 1)while(curx!=x2)curx +=1;cury +=k;putpixel(curx,cury,color);else while(curx!=x2) cury +=1;curx +=1/k; putpixel(curx,cury,color); return(0);main() int x1,y1,x2,k; int color = 10; int gdriver=detect,gmode;

4、detectgraph(&gdriver,&gmode); initgraph(&gdriver,&gmode,); printf(please input begin:); scanf(%d%d,&x1,&y1); printf(/nplease input end:); scanf(%d%d,&x2,&k); addline(k,320+x1,240+y1,320+x2,color); getch(); cleardevice(); closegraph();(3)、运行结果(二)、bresenham直线生成算法(1)、算法1bresenham算法画直线:由bresenham算法的基本原理

5、是每次在最大位移方向上面走一步,而另一个方向上是走步还是不走步取决于误差项的判别。而在误差项的判别是利用中点来判断的,是否走一步,取决于中点的位置,若如果中点在直线上部,则不需要走一步,如果中点在直线下部,则要走一步。其绘图过程为:(1)输入直线的两端点p0(x0,y0)和p1(x1,y1)。(2)计算初始值x, y,d=x-2y,x=x0,y=y0。(3)绘制点(x,y),判断d的符号。若d0,则(x,y)更新为(x+1,y+1),d更新为d+2x2y;否则(x,y)更新为(x+1,y),d更新为d-2y.(4)当直线未画完时,重复步骤(3),否则结束。(2)、源程序#include #in

6、clude #include int bres_line(int x1,int y1,int x2,int y2,int color) int oldcolor,itag; int dx,dy,tx,ty,inc1,inc2,curx,cury,d; putpixel(x1,y1,color); if (x1=x2 & y1=y2) return(1); itag=0; dx = abs(x2-x1); dy = abs(y2-y1); if(dx0?1:-1;ty=(y2-y1)0?1:-1;curx = x1;cury = y1;inc1 = 2*dy;inc2 = 2*(dy-dx);d

7、=inc1-dx;while(curx!=x2) if (d0) d+=inc1; else cury+=ty; d+=inc2; if(itag)putpixel(cury,curx,color);elseputpixel(curx,cury,color);curx+=tx;return(0);iswap(int *a,int *b) int tmp; tmp = *a; *a=*b; *b=tmp;main() int i,j,x1,y1,x2,y2; int color = 15; int gdriver=detect,gmode; initgraph(&gdriver,&gmode,)

8、; printf(please input begin(x1,y1):); scanf(%d%d,&x1,&y1); printf(/n please input end(x2,y2):); scanf(%d%d,&x2,&y2); i=20; j=240; moveto(i,j); for(i=20;i=620;i+=20) /*使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j); bres_line(x

9、1,y1,x2,y2,color); getch(); closegraph();(3)、运行结果(三)、bresenham画圆算法(1)、算法设圆的半径为r,考虑圆心在(0,0),从x=0、y=r开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束,即有xi+1= xi+1;相应的yi+1则在两种可能中选择:yi+1=yi或者yi+1=yi-1。选择的原则是考察精确值y是靠近yi还是靠近yi-1。根据定义可推导出递推公式有:如果di0,选si,xi=xi-1+1,yi=yi-1,得: di+1=di+4xi-1+6如果di0,选ti,xi=xi-1+

10、1,yi=yi-1-1,得: di+1=di+4(xi-1-yi-1)+10对于i=1,xi-1=x0=0,yi-1=y0=r,则初值为: d1=3-2r(2)、源程序 #include #include #include #include int bres_circle(int x0,int y0,double r,int color) int x,y,d; x=0; y=(int)r; d=(int)(3-2*r); while(xy) cirpot(x0,y0,x,y,color); if(d0) d+=4*x+6; else d+=4*(x-y)+10; y-; x+; if(x=y)

11、cirpot(x0,y0,x,y,color);return(0);int cirpot(int x0,int y0,int x,int y,int color) int oldcolor; putpixel(x0+x),(y0+y),color); putpixel(x0+y),(y0+x),color); putpixel(x0+y),(y0-x),color); putpixel(x0+x),(y0-y),color); putpixel(x0-x),(y0-y),color); putpixel(x0-y),(y0-x),color); putpixel(x0-y),(y0+x),co

12、lor); putpixel(x0-x),(y0+y),color); return(0);main() int i,j,x0,y0,gmode; float r; int color=15; int gdriver=detect; initgraph(&gdriver,&gmode,); printf(please input begin(x0,y0):); scanf(%d%d,&x0,&y0); printf(/n please input end(r):); scanf(%f,&r); i=20; j=240; moveto(i,j); for(i=20;i=620;i+=20) /*

13、使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j); bres_circle(x0,y0,r,color); getch(); closegraph();(3)、运行结果(四)、角度dda法产生圆弧(1)、算法若已知圆心坐标为(xc,yc),半径为人,则以角度t为参数的圆的参数方程可写为:x=xc+rcosty=yc+ rsint 当t从0变化到2时,上述方程所表示的轨迹是一整圆;到t从ts变化到te时,则

14、产生一段圆弧。由于我们定义角度的正方向是逆时针方向,所以圆弧是有ts到te逆时针画圆得到的。若给定圆心坐标(xc,yc),半径r及起始角ts和终止角te,要产生ts到te这段圆弧的最主要问题是离散化圆弧,即求出从ts到te所需运动的总步数n。可令:n=(te-ts)/dt+0.5其中,dt为角度增量,即每走一步对应的角度变化。如果用户的给定tets,则可令te=ts+2以保证ts到te是逆时针画圆。如果n=0,则令n=2/dt,即画整圆。(2)、源程序#include #include #include arc1 (int xc,int yc,double r,double ts,double

15、 te) double rad,tsl,tel,deg,dte,ta,ct,st;int x,y,n,i; rad =0.0174533;tsl=ts*rad;tel=te*rad;if(r5.08) deg=0.015;elseif(r7.62)deg = 0.06; elseif(r25.4)deg = 0.075;elsedeg =0.15;dte=deg*25.4/r;if(teltsl)tel+=6.28319; n=(int)(tel-tsl)/dte+0.5);if(n=0)n=(int)(6.28319/dte+0.5);ta=tsl;x=xc+r*cos(tsl);y=yc+

16、r*sin(tsl);moveto(x,y);for(i=1;i=n;i+) ta+=dte; ct=cos(ta); st=sin(ta); x=xc+r*ct; y=yc+r*st; lineto(x,y);x=xc+r*cos(tel); y=yc+r*sin(tel);lineto(x,y);main() int xc,yc; float r,ts,te; int gdriver=detect,gmode; initgraph(&gdriver,&gmode,); printf(please input begin(xc,yc)as(xc=320,yc=240):); scanf(%d

17、%d,&xc,&yc); printf(/n please input end(r,ts,te)as(r=100,ts=20,te=200):); scanf(%f%f%f,&r,&ts,&te); arc1(xc,yc,r,ts,te); getch(); closegraph();(3)、运行结果实验二 自由曲线一、实验目的与要求(1)掌握三次三次参数样条曲线、bezier曲线和b样条曲线生成原理(2)设计三次参数样条曲线、bezier曲线和b样条曲线程序二、实验内容(一)、三次参数样条曲线段算法如下:每段三次样条曲线都是由其起始点的位置向量p0、p1和起始点处的切线向量p0、p1分解为二

18、维平面的x、y方向的分量,即p0p1p0p12 -2 1 1-3 3 -2 -10 0 1 01 0 0 0p(t)=t3 t2 t 1令=f0(t) f1(t) g0(t) g1(t)p0p1p0p13 -2 1 1-3 3 -2 -10 0 1 01 0 0 0t3 t2 t 1式中 f0(t) =2t3 - 3t2+1(0t1) f1(t) = -2t3 +3t g0(t)=t(t-1) g1(t) =t2(t-1)这组函数称为混合函数。曲线的形状是受曲线段两端点的位置向量和切线向量控制的。当端点的边界条件发生变化时,曲线的形状随之发生变化。(2)源程序下例是绘制一条三次参数样条曲线的程

19、序。程序中,数组px6、py6存放控制点的x,y坐标;数组dx6dy6存放控制点处切线向量的x、y分量;n为每段的等分数。#include #include float px6=50,170,250,310,500,700;float py6=200,220,200,150,200,150;float dx6=100,80,100,300,200,100;float dy6=-100,200,150,-200,-100,100;void spline() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(

20、yellow); dt=1/n; for (k=0;k=6-1 ;k+ ) if(getch()=17) exit(); a0=pxk; a1=dxk; a2=-3*pxk+3*pxk+1-2*dxk-dxk+1; a3=2*pxk-2*pxk+1+dxk+dxk+1; b0=pyk; b1=dyk; b2=-3*pyk+3*pyk+1-2*dyk-dyk+1; b3=2*pyk-2*pyk+1+dyk+dyk+1; for(i=0;in;i+=0.1) t=i*dt; x=a0+a1*t+a2*t*t+a3*t*t*t; y=b0+b1*t+b2*t*t+b3*t*t*t; if(i=0)

21、moveto(x,y); lineto(x,y); void main() int driver,mode,i,j; driver=detect; i=20; j=240; initgraph(&driver,&mode,); moveto(i,j); for(i=20;i=620;i+=20) /*使用双循环画点函数画出表格中的纵坐标*/ lineto(i,240); i=320; j=20; moveto(i,j); for(j=20;j=460;j+=20) /*使用双循环画点函数画出表格中的横坐标*/ lineto(320,j); printf(press any key to con

22、tinue except ctrl+q to quit.n); spline(); if(getch()=17)exit(); closegraph();(二)、三次bezier曲线段 三次bezier曲线的矩阵表达形式如下:p0p1p2p3-1 3 -3 13 -6 3 0-3 3 0 01 0 0 0p(t)=t3 t2 t 14个控制点p0、p1、p2、p3连成的折线多边形称为特征多边形,bezier曲线的形状是由这个多边形的各个顶点的位置确定的,特征多边形的形状改变,则曲线的形状也就随之改变。(2)源程序程序中,数组px10、py10存放控制点的x,y坐标。#include #incl

23、ude float px10=50,80,120,140,180,230,270,330,380,430;float py10=100,230,230,160,50,50,120,230,230,150;void bezier() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(15); dt=1/n; for(k=0;k10-1;k+) moveto(pxk,pyk); lineto(pxk+1,pyk+1); setcolor(10); for(k=0;k10-3;k+=3) if(getch()=

24、17) exit(); a0=pxk; a1=-3*pxk+3*pxk+1; a2=3*pxk-6*pxk+1+3*pxk+2; a3=-pxk+3*pxk+1-3*pxk+2+pxk+3; b0=pyk; b1=-3*pyk+3*pyk+1; b2=3*pyk-6*pyk+1+3*pyk+2; b3=-pyk+3*pyk+1-3*pyk+2+pyk+3; for (i=0;in ;i+=0.1 ) t=i*dt; x=a0+a1*t+a2*t*t+a3*t*t*t; y=b0+b1*t+b2*t*t+b3*t*t*t; if(i=0) moveto(x,y); lineto(x,y); vo

25、id main() int driver,mode; driver=detect; initgraph(&driver,&mode,); printf(press any key to continue except ctrl+q to quitn); bezier(); if(getch()=17) exit(); closegraph();(3)、运行结果(三)、三次b样条曲线段三次b样条曲线的矩阵表达式为 p0p1p2p3-1 3 -3 13 -6 3 0-3 0 3 01 4 1 0p(t)=(1/6)*t3 t2 t 1 源程序程序中,px10、py10存放控制点的x,y坐标。#in

26、clude #include float px10=50,90,150,120,220,300,380,320,450,500;float py10=100,60,50,150,240,100,100,200,250,130;void b_spline() float a0,a1,a2,a3,b0,b1,b2,b3; int k,x,y; float i,t,dt,n=10; setcolor(15); dt=1/n; for(k=0;k10;k+) if(k=0) moveto(pxk,pyk); lineto(pxk,pyk); setcolor(10); for(k=0;k10-3;k+

27、) if(getch()=17) exit(); a0=(pxk+4*pxk+1+pxk+2)/6; a1=(pxk+2-pxk)/2; a2=(pxk-2*pxk+1+pxk+2)/2; a3=-(pxk-3*pxk+1+3*pxk+2-pxk+3)/6; b0=(pyk+4*pyk+1+pyk+2)/6; b1=(pyk+2-pyk)/2; b2=(pyk-2*pyk+1+pyk+2)/2; b3=-(pyk-3*pyk+1+3*pyk+2-pyk+3)/6; for(i=0;in;i+=0.1) t=i*dt;x=a0+a1*t+a2*t*t+a3*t*t*t;y=b0+b1*t+b2*

28、t*t+b3*t*t*t;if(i=0) moveto(x,y);lineto(x,y); void main() int driver,mode; driver=detect; initgraph(&driver,&mode,); printf(press any key to continue except ctrl+q to quitn); b_spline(); if(getch()=17) exit(); closegraph();图形学、cad二次开发及动画课程设计第一部分:1.编写一个autolisp程序,其功能是:根据圆心c1、直径d1、d2、d3画三个同心圆如图1所示。程序应

29、提示用户输入c1、d1、d2、d3点的坐标。#include #include #include #include int bres_circle(int x0,int y0,double r,int color) int x,y,d; x=0; y=(int)r; d=(int)(3-2*r); while(xy) cirpot(x0,y0,x,y,color); if(d0) d+=4*x+6; else d+=4*(x-y)+10; y-; x+; if(x=y)cirpot(x0,y0,x,y,color);return(0);int cirpot(int x0,int y0,int

30、x,int y,int color) int oldcolor; putpixel(x0+x),(y0+y),color); putpixel(x0+y),(y0+x),color); putpixel(x0+y),(y0-x),color); putpixel(x0+x),(y0-y),color); putpixel(x0-x),(y0-y),color);putpixel(x0-y),(y0-x),color);putpixel(x0-y),(y0+x),color);putpixel(x0-x),(y0+y),color); return(0);main() int x0,y0,gmo

31、de; float r1,r2,r3; int color=15; int gdriver=detect; initgraph(&gdriver,&gmode,); printf(please input begin(x0,y0)as(x0=320,y0=240):); scanf(%d%d,&x0,&y0); printf(/n please input r(r1)as(r1=50):); scanf(%f,&r1); printf(/n please input r(r2)as(r2=100):); scanf(%f,&r2); printf(/n please input r(r3)as(r3=150):); scanf(%f,&r3); bres_circle(x0,y0,r1,color); bres_circle(x0,y0,r2,color); bres_circle(x0,y0,r3,color); getch(); closegraph();运行结果2.编写一个autolisp程序,其功能是:画一个等腰三角形( p1、p2、p3 ),如图3所示。程序应提示用户输入起始点p 1、长度l 1和角度a。#include

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论