欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

图形学实验报告格式.doc

  • 资源ID:9074047       资源大小:209KB        全文页数:38页
  • 资源格式: DOC        下载积分:9.9积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要9.9积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

图形学实验报告格式.doc

实验一 直线、圆弧及曲线的生成算法一、实验目的1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。3、掌握用像素点法直接生成其它曲线的方法。二、基本要求1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。三、算法提示1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。直线Bresenham生成算法思想如下(第一象限,且斜率k<1的情况 图2-1 a中的1a):1) 画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1;2) 求直线下一点位置 xi+1=xi+1 如果Pi>0,则yi+1=yi+1,否则 yi+1=yi;3) 画点(xi+1,yi+1);4) 求下一个误差Pi+1点,如果Pi>0,则Pi+1=Pi+2dy-2dx,否则 Pi+1=Pi+2dy;5) i=i+1,如果i<dx+1则转步骤2,否则结束操作。Bresenham生成算法的优点如下;1)不必计算直线的斜率,因此不做除法。2)不用浮点数,只用整数。3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。Bresenham算法的速度很快,并适于用硬件实现。对于图2-1 a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。对于图2-1 a中的1b,斜率k>1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1 b)。Bresenham生成算法思想如下(第一象限,且斜率k<1的情况):1) 计算误差初值P1=3-2r,i=1,画点(0,r);2) 求下一个光栅点位置 xi+1=xi+1 如果Pi<0,则yi+1=yi,否则 yi+1=yi-1;3) 画点(xi+1,yi+1);4) 求下一个误差Pi+1点,如果Pi<0,则Pi+1=Pi+2xi+6,否则 Pi+1=Pi+4(xi-yi)+10;5) i=i+1,如果x=y则结束操作,否则转步骤2。圆Bresenham算法的算式简单,只需做加减法和乘4运算3对屏幕布局的考虑适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成一个图形。也可用delay实现延时实现动画。四、上机作业题及思考题1、用正负法编程绘制圆弧 2、用直线Bresenham生成算法绘制直线。3、用Bresenham生成算法绘制圆。五、参考源程序1、 数值微分法生成斜率小于的直线/* DDA line 数值微分法生成斜率小于的直线 */#include <math.h>#include "display.h"main() int xo,yo,xa,ya,i,j; int dx,dy,c; float ddx,ddy,x,y; Initialize(); printf("input start x,y(x=0-640,y=0-480)n"); scanf("%d,%d",&xo,&yo); /* 输入直线的两个点 */ printf("xa:%d- 639 ",xo); scanf("%d",&xa); printf(" ya: 0 . %d ",yo); scanf("%d",&ya); printf("red line is system,yellow is createn"); if (xa>=xo && xa<=639 && ya>=0 && ya<=yo) /* 数值微分法生成直线算法 */ outtextxy(xo,yo+5,"o"); outtextxy(xa,ya-10,"a"); dx=xa-xo; dy=yo-ya; if (dx>dy) c=dx; else c=dy; ddx=dx*1.0/c; ddy=dy*1.0/c; x=xo*1.0; y=yo*1.0; setcolor(12); line(xo,yo,xa,ya); getch(); while (c>=0) i=round(x);j=round(y);putpixel(i,j,14);x=x+ddx;y=y-ddy;c=c-1; else printf("data error"); getch(); closegraph(); int round(ff)float ff; int k; if (ff-(int)ff)>0.5) k=(int)ff+1; else k=(int)ff; k=(int)ff; return(k); 2、逐点插补法生成圆弧源程序 /* STEP CIRCLE 逐点插补法生成圆弧 */#include <math.h>#include "display.h"main() int xo,yo,xa,ya,r,l,f; Initialize(); printf("input x,y,r"); /* 输入圆心和半径*/ scanf("%d,%d,%d",&xo,&yo,&r); xa=xo+r; ya=yo; setcolor(12); circle(xo,yo,r); line(xo-r,yo,xo+r,yo); line(xo,yo-r,xo,yo+r); line(xo,yo,xo+140,yo-140); l=r*1.414/2; f=0; while (l!=0) putpixel(xa,ya,14); putpixel(xa,2*yo-ya,14); putpixel(2*xo-xa,ya,14); putpixel(2*xo-xa,2*yo-ya,14); putpixel(xo+ya-yo,yo+xa-xo,14); putpixel(xo+ya-yo,yo-xa+xo,14); putpixel(xo-ya+yo,yo+xa-xo,14); putpixel(xo-ya+yo,yo-xa+xo,14); getch(); if (f>=0) xa=xa-1; f=f-2*(xa-xo)+1; else ya=ya-1; f=f+2*(yo-ya)+1; l=l-1; getch(); closegraph(); 3、椭圆的生成算法/*elipse 生成椭圆 */#include <math.h>#include "display.h"main() Initialize(); draw_ett(180,100,14); getch(); closegraph(); draw_ett(a,b,color) int a,b,color; int x,y,xo,yo; int l; float f,ff; xo=300; yo=200; x=0; y=b; f=1.0*b*b+a*a*(-b+0.25); putpixel(xo,yo,12); while (1.0*b*b*(x+1)<=a*a*(y-0.5) putpixel(x+xo,yo-y,color); if (f<0) f=f+1.0*b*b*(2*x+3); x=x+1; else f=f+1.0*b*b*(2*x+3)+1.0*a*a*(-2*y+2); x=x+1; y=y-1; f=1.0*b*b*(x+0.5)*(x+0.5)+1.0*a*a*(y-1)*(y-1)-1.0*a*b*a*b; while (y>0) putpixel(x+xo,yo-y,color); if (f<0) f=f+1.0*b*b*(2*x+2)+1.0*a*a*(-2*y+3); x=x+1; y=y-1; else f=f+1.0*a*a*(-2*y+3); y=y-1; 计算机图形学实验报告一实验名称 直线、圆弧及曲线的生成算法 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号 一、实验目的二、实验要求三、关键算法及实现原理四、程序调试中的问题五、程序运行结果或数据六、实验收获及体会七、参考源程序(可附页)实验二 二维图形的几何变换一、实验目的1、复习不同的二维坐标变换公式。2、掌握二维坐标变换公式的使用方法。3、对二维坐标组合变换的灵活运用。二、基本要求1、在屏幕上绘制出较简单的几何图形。2、 对1的图形进行平移变换,绘制出变换后的几何图形,并在下边标注出实施x,y各多少的平称坐标变换。3、对1的图形进行旋转变换,绘制出变换后的几何图形,并在下边标注出实施多少度的旋转坐标变换。4、对1的图形进行对称变换,绘制出变换后的几何图形,并在下边标注出实施对什么坐标进行的对称变换。5、对1的图形进行错切变换,绘制出变换后的几何图形,并在下边标注出实施对何种坐标进行的错切变换。6、对1的图形进行比例变换,绘制出变换后的几何图形,并在下边标注出实施的多少比例坐标变换。7、为了进行比较,适当选择坐标,可将原图(变换前)及经过不同变换后的图形绘制在同一个屏幕上,设置不同的线形或颜色加以区分各种变换。三、算法提示1、二维图形的变换实际上是一个变换矩阵,平面图形是由若干个二维点(xi,yi)组成,经过变换后的二维点(xi, yi),其变换公式为: 对应于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。因此对每一种坐标变换编成一个子程序。2、编程时的技巧用数组将二维图形的特征坐标点(顶点)保存,将由特征坐标点(顶点)绘制出二维图形的命令编一个绘图子程序,调用绘图子程序绘制出变换以前的图形,根据不同的两维几何变换,选用相应二维坐标变换公式(调用相应的子程序)将二维坐标进行坐标变换;再调用绘图子程序将变换后的坐标值在屏幕上绘制变换后的几何将图形,可选用不同的颜来区分各种不同几何变换的图形。四、上机作业题1、 编写一个能对任何直线能实现对称变换的子程序。2、 作出右边的图形,并作下列变换,用不同颜色作出变换后的图形。1) 作平移(50,-150)。2) 旋转 90度。3) 对X=Y直线作对称变换。4) 沿Y方向作错切变换。五、参考实例源程序下面是对四边形能完成单项二维变换(平移、比例、错切)的源程序#include<graphics.h>#include<conio.h>#include<dos.h>#include<math.h>double xmax=639.0, ymax=399.0;double f33,xx,yy;int scx(double xj)int x;x=(int)(xj+xmax/2);return(x);int scy(double yj)int y;y=ymax-(int)(yj+ymax/2);return(y);void parallel(double dx,double dy)f00=1.0;f01=0.0;f02=0.0;f10=0.0;f11=1.0;f12=0.0;f20=dx; f21=dy; f22=1.0;void scale(double s)f00=s;f01=0.0;f02=0.0;f10=0.0;f11=s;f12=0.0;f20=0.0; f21=0.0; f22=1.0;void taisho_y()f00=-1.0;f01=0.0;f02=0.0;f10=0.0;f11=1.0;f12=0.0;f20=0.0; f21=0.0; f22=1.0;void axis()line(scx(0.0),scy(-ymax/2),scx(0),scy(ymax/2);line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0);void tuoq(double a,double b)f00=1.0;f01=b;f02=1.0;f10=a;f11=1.0;f12=0.0;f20=0.0; f21=0.0; f22=1.0;double affinex(double x,double y,double d)xx=x*f00+y*f10+d*f20;return(xx);double affiney(double x,double y,double d)yy=x*f01+y*f11+d*f21;return(yy);void drawtu(x2,y2)double x25,y25;int i;for(i=0;i<=3;i+) line(scx(x2i),scy(y2i),scx(x2i+1),scy(y2i+1); void main()int drive=DETECT,mode;static double x1=50.0,60.0,150.0,160.0,50.0;static double y1=0.0,50.0,50.0,-10.0,0.0;static double x25,y25;int i;double x,y,xx,yy,yt;initgraph(&drive,&mode,"c:tc3bgi"); setcolor(RED); axis(); for(i=0;i<=3;i+) line(scx(x1i),scy(y1i),scx(x1i+1),scy(y1i+1); /*parallel(100,-100) */ getch(); x=100;y=-100; parallel(x,y); setcolor(BLUE); for(i=0;i<=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,"parallel(100,-100)");/*taisho_y() */ getch(); taisho_y(); setcolor(YELLOW); for(i=0;i<=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,"taisho_y");/*touq(2,0) */ getch(); tuoq(2,0); setcolor(LIGHTBLUE); for(i=0;i<=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,"tuoq(2,0)");/*scale(2) */ getch(); scale(2); setcolor(LIGHTRED); for(i=0;i<=4;i+) x2i=affinex(x1i,y1i,1.0); y2i=affiney(x1i,y1i,1.0); drawtu(x2,y2); yt=scy(y20)+10; outtextxy(scx(x20),yt,"scale 2");getch();closegraph();计算机图形学实验报告二实验名称 二维图形的几何变换 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号 一、实验目的二、实验要求三、关键算法及实现原理四、程序调试中的问题五、程序运行结果或数据六、实验收获及体会七、参考源程序(可附页)实验三 进行多边形的裁剪及填充一、实验目的1、 复习编码裁剪法和矢量裁剪法。2、 复习多边形区域填充和种子填充的原理和算法。3、掌握编码裁剪法的编程方法和步骤。4、多边形逐边裁剪法的编程方法实现编程。5、掌握种子填充算法的基本原理和编程方法。二、基本要求1、 在屏幕上绘制出一个矩形作为裁剪边界,再用不同的颜色绘出几个由线段组成的简单几何图形,它们和裁剪边界可相交或不相交。按一个键,实现一条线段的裁剪,裁剪后的线段可用另一种颜色绘制,继续按键,直至全部线段裁剪完。2、在屏幕上绘制用线、矩形、圆、多边形等绘制一些简单的几何图形,选择合适的种子坐标,用种子填充方法将它填充。对于被划分为多个区域的几何图形,注意观察改变种子坐标点的位置,所填充的区域不同。三、算法提示1、Sutherland-Cohen(编码) 裁剪算法用数组保存裁剪边界的坐标值和被裁剪边界的坐标值;根据逐边裁剪方法对被裁剪边界进裁剪,计算出裁剪后的坐标;再将裁剪后的直线用不同颜色绘制到屏幕上。2、Sutherland-Hodgman 多边形裁剪算法多边形裁剪算法的关键在于,通过裁剪,不仅要保留窗口内多边形的边界部分,而且要将窗框有关部分按一定的次序插入多边形保留边界之间,从而使多边形的边仍然保持封闭状态。Sutherland-Hodgman 多边形裁剪算法:令多边形的顶点按边线逆时针走向排序P1、P2、Pn,多边形各边先与上窗框求交。求交后删去多边形一窗框之上的部分,并插入窗边及延长线与多边形的交点之间的部分,从而形成一个新多边形。然后,新的多边形按相同的方法与右窗框相剪裁。如此重重,直至多边形与各窗框都裁剪完毕。3、种子填充算法种子填充算法采用的边界定义是区域边界上所有像素均具有某个特定值,区域内部所有像素均不取这一特定颜色。用函数getpixel(seedx,seedy) 取出种子坐标点(seedx,seedy)的像素点的颜色,如果它的颜色值不等于边界指定的颜色值,则对它用指定的颜色进行填充。用四向连通方法是指从区域上一点(种子坐标点)出发,可通过上、下、左、右四个方向(沿X,Y坐标正负方向各前进一个单位)作为新的种子点进行填充。编程时宜采用递归方式进行。四、上机作业题1、编写编码裁剪算法源程序,并实现对一些图形的裁剪2、用种子填充算法编程实现对几个二维图形的填充。五、实例源程序1Sutherland-Hodglman多边形裁剪算法源程序,用一个矩形作为裁剪边界裁剪一个多边形,要求数据结构的链表学得较好。 /* Sutherland-Hodgman 算法 */#define LEN sizeof(struct node)#include <math.h>#include "display.h" struct node int dx,dy; struct node *next; ;struct node *creat() struct node *h,*q,*r; int p82=100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,190; int i; setcolor(12); for (i=0;i<7;i+) line(pi0,pi1,pi+10,pi+11); line(p00,p01,p70,p71); rectangle(120,200,230,70); h=NULL; for (i=0;i<8;i+) q=(struct node *)malloc(LEN); q->dx=pi0; q->dy=pi1; if (h=NULL) h=q; else r->next=q; r=q; r->next=NULL; return(h);struct node *builx(h,x)struct node *h;int x;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p->dx; s1=p->dy; p=p->next; while (p!=NULL) j0=x; j1=s1+(p->dy-s1)*(x-s0)/(p->dx-s0); max=s0; min=p->dx; if (s0<p->dx) max=p->dx;min=s0; if (j0>=min)&&(j0<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL) hh=q;else r->next=q; r=q; if (p->dx>=x) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; s0=p->dx; s1=p->dy; p=p->next; p=h; j0=x; j1=s1+(p->dy-s1)*(x-s0)/(p->dx-s0); max=s0; min=p->dx; if (s0<p->dx) max=p->dx;min=s0; if (j0>=min)&&(j0<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL)hh=q; else r->next=q; r=q; if (p->dx>=x) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; r->next=NULL; return(hh);struct node *builxx(h,x)struct node *h;int x;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p->dx; s1=p->dy; p=p->next; while (p!=NULL) j0=x; j1=s1+(p->dy-s1)*(x-s0)/(p->dx-s0+0.1); max=s0; min=p->dx; if (s0<p->dx) max=p->dx;min=s0; if (j0>=min)&&(j0<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL) hh=q;else r->next=q; r=q; if (p->dx<=x) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; s0=p->dx; s1=p->dy; p=p->next; p=h; j0=x; j1=s1+(p->dy-s1)*(x-s0)/(p->dx-s0+0.1); max=s0; min=p->dx; if (s0<p->dx) max=p->dx;min=s0; if (j0>=min)&&(j0<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL)hh=q; else r->next=q; r=q; if (p->dx<=x) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; r->next=NULL; return(hh);struct node *buily(h,y)struct node *h;int y;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p->dx; s1=p->dy; p=p->next; while (p!=NULL) j1=y; j0=s0+(p->dx-s0)*(y-s1)/(p->dy-s1+0.1); max=s1; min=p->dy; if (s1<p->dy) max=p->dy;min=s1; if (j1>=min)&&(j1<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL) hh=q;else r->next=q; r=q; if (p->dy>=y) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; s0=p->dx; s1=p->dy; p=p->next; p=h; j1=y; j0=s0+(p->dx-s0)*(y-s1)/(p->dy-s1+0.1); max=s1; min=p->dy; if (s1<p->dy) max=p->dy; min=s1; if (j1>=min)&&(j1<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL)hh=q; else r->next=q; r=q; if (p->dy>=y) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; r->next=NULL; return(hh);struct node *builyy(h,y)struct node *h;int y;int s2,j2; struct node *hh,*p,*r,*q; int max,min; p=h; hh=NULL; s0=p->dx; s1=p->dy; p=p->next; while (p!=NULL) j1=y; j0=s0+(p->dx-s0)*(y-s1)/(p->dy-s1+0.1); max=s1; min=p->dy; if (s1<p->dy) max=p->dy;min=s1; if (j1>=min)&&(j1<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL) hh=q;else r->next=q; r=q; if (p->dy<=y) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; s0=p->dx; s1=p->dy; p=p->next; p=h; j1=y; j0=s0+(p->dx-s0)*(y-s1)/(p->dy-s1+0.1); max=s1; min=p->dy; if (s1<p->dy) max=p->dy; min=s1; if (j1>=min)&&(j1<=max) q=(struct node *)malloc(LEN); q->dx=j0; q->dy=j1; if (hh=NULL)hh=q; else r->next=q; r=q; if (p->dy<=y) q=(struct node *)malloc(LEN); q->dx=p->dx; q->dy=p->dy; if (hh=NULL) hh=q; else r->next=q; r=q; r->next=NULL; return(hh);main() int max,min; struct node *head,*r,*q; int i; int s2; Initialize(); head=creat(); q=head; while (q->next!=NULL) putpixel(q->dx,q->dy,14); q=q->next; putpixel(q->dx,q->dy,14); q=builx(head,120); head=q; while (q->next!=NULL) putpixel(q->dx,q->dy,15); q=q->next; putpixel(q->dx,q->dy,15); q=buily(head,70); head=q; while (q->next!=NULL) putpixel(q->dx,q->dy,2); q=q->next; putpixel(q->dx,q->dy,2); q=builxx(head,230); head=q; while (q->next!=NULL) putpixel(q->dx,q->dy,1); q=q->next; putpixel(q->dx,q->dy,1); q=builyy(head,200); head=q; s0=q->dx; s1=q->dy; q=q->next; setcolor(14); while (q!=NULL) line(s0,s1,q->dx,q->dy); s0=q->dx; s1=q->dy; q=q->next; q=head; line(s0,s1,q->dx,q->dy); getch();2四向连通种子填充算法子程序 Fill4(int seedx,int seedy,int color) int fill; fill=getpixel(seedx,seedy); if(fill!=color) putpixel(seedx,seedy,color); Fill4(seedx+1,seedy,color); Fill4(seedx-1,seedy,color); Fill4(seedx,seedy+1,color); Fill4(seedx,seedy-1,color); 计算机图形学实验报告三实验名称 进行多边形的裁剪及填充 评分 实验日期 年 月 日 指导教师 姓名 专业班级 学号 一、实验目的二、实验要求三、关键算法四、程序调试中的问题五、程序运行结果或数据六、实验收获及体会七、参考源程序(可附页)实验四 绘制三维图形一、实验目的1、复习用二维图来表示三维立体图形,三视图的表示及的三视图的变换矩阵2、掌握用C语言编程实现三维简单立体的三视图的绘制二、基本要求1、在屏幕上绘制出一个长方体或简单几何体的三视图投影图形,要求在图形下方标出是什么投影图形。2、在屏幕上绘制出一个长方体或简单几何体的透视投影图形。三、算法提示1、 二维屏幕表示三维立体图的关键:屏幕是一个二维的平面空间,要在它上做出三维的图形,就必须把三维的空间图形通过一个投影变换变为二维的图形,即投影变换把三维坐标点(x,y,z)变为(x,0,z)。2、 投影变换的类型3、 按下述步骤编写绘制三维图形的函数 在草稿纸上给出草图,并确定各顶点的序号和相应的顶点坐标值,建立顶点表和连边表。 在程序中定义三个数组,用于存放顶点的(x,y,z)的坐标值。 实施对立方体进行相应的投影变换,即对顶点矩阵与变换矩阵相乘,得到一个新的顶点矩阵。 用新顶点表的坐标值,注意些时只有x坐标和z坐标,y坐标已在投影中消掉,按边表的连线规则,用line函数在顶点之间两两连线。3、将每一个几何变换编写成一个函数,在主程序中进行坐标变换时,直接调用相应的函数即可;变换后调用绘图函数用不同颜色在屏幕上绘出变换后的图形。四、上机作业题1、将右边的立体作出它的主视图、俯视图、侧视图。五、实例源程序#include<graphics.h>#include<conio.h>#include<dos.h>#include<math.h>double xmax=639.0, ymax=399.0;double f44,xx,yy,zz,dd;int scx(double xj) int x; x=(int)(-xj+xmax/2); return(x);int scy(double yj) int y; y=ymax-(int)(yj+ymax/2); return(y);void tv() f00=1.0;f01=0.0;f02=0.0;f03=0.0; f10=0.0;f11=0.0;f12=0.0;f13=0.0; f20=0.0;f21=0.0; f22=1.0;f23=0.0; f30=0.0;f31=0.0; f32=1.0;f33=1.0;void th( int n) f00=1.0;f01=0.0;f02=0.0;f03=0.0; f10=0.0;f11=0.0;f12=-1.0;f13=0.0; f20=0.0;f21=0.0; f22=0.0;f23=0.0; f30=0.0;f31=0.0; f32=-n;f33=1.0;void tw( int d) f00=0.0;f01=0.0;f02=0.0;f03=0.0; f10=-1.0;f11=0.0;f12=0.0;f13=0.0; f20=0.0;f21=0.0; f22=1.0;f23=0.0; f30=-d;f31=0.0; f32=0.0;f33=1.0;void teq() f00=0.707;f01=0.0;f02=-0.408;f03=0.0; f10=-0.707;f11=0.0;f12=-0.408;f13=0.0; f20=0.0;f21=0.0; f22=0.816;f23=0.0; f30=0.0;f31=0.0; f32=0.0;f33=1.0;void tt1yq(double l,double n,double m,double q) f00=1.0;f01=0.0;f02=0.0;f03=0.0; f10=0.0;f11=0.0;f12=0.0;f13=q; f20=0.0;f21=0.0; f22=1.0;f23=0.0; f30=l;f31=0.0; f32=n;f33=m*q+1;void axis() line(scx(0.0),scy(ymax/2),scx(0),scy(0.0); line(scx(0),scy(0),scx(xmax/2),scy(-ymax/2)-19); line(scx(0),scy(0),scx(-xmax/2),scy(-ymax/2)-19); outtextxy(scx(0),ymax/2+10,"O"); outtextxy(scx(-xmax/2+10),scy(-ymax/2)-10,"Y"); outtextxy(scx(xmax/2),scy(-ymax/2)-10,"X"); outtextxy(scx(0)+3,scy(ymax/2)+6,"Z");double affine3x(double x,double y,double z,double d) xx=x*f00+y*f10+z*f20+d*f30; return(xx);double affine3y(double x,double y,double z,double d) yy=x*f01+y*f11+z*f21+d*f31; return(yy);double affine3z(double x,double y,double z,double d) zz=x*f02+y*f12+z*f22+d*f32; return(zz);double affine3d(double x,double y,double z,double d) dd=x*f03+y*f13+z*f23+d*f33; return(dd);void draw(x1,z

注意事项

本文(图形学实验报告格式.doc)为本站会员(jian****018)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!