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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

图形学实验报告.docx

1、图形学实验报告计算机图形学实验报告1、 直线的生成程序设计:实验目的:掌握直线段的生成算法,并用C/WIN-TC/VC+实现算法,包括中点法生成直线,微分数值法生成直线段等。实验内容:用不同的方法生成斜率不同的直线段,比较各种方法的效果。/ CLineView drawingvoid DDALine(int x1,int y1,int x2,int y2,int color,CDC*pDC)/数值微分法 int x; int k,y=y1; k=1.0*(y2-y1)/(x2-x1); for(x=x1;xSetPixel(x,(int)(y+0.5),color); y=y+k; void

2、MPLine(int x1,int y1,int x2,int y2,int color,CDC*pDC)/中点画线法 int x,y,a,b,d,d1,d2; a=y1-y2; b=x2-x1; y=y1; d=2*a+b; d1=2*a; d2=2*(a+b); pDC-SetPixel(x,y,color); for(x=x1;x=x2;x+) if(dSetPixel(x,y,color); void BHLine(int x1,int y1,int x2,int y2,int color,CDC*pDC)/Bresenham画线法 int x,y,dx,dy,dk; dx=abs(x

3、2-x1);dy=abs(y2-y1); dk=2*dy-dx;y=y1; for(x=x1;xSetPixel(x,y,color); dk=dk+2*dy; if(dk=0) y+; dk=dk-2*dx; void CLineView:OnDraw(CDC* pDC) CLineDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); DDALine(100,100,200,70,255,pDC);/数值微分法 pDC-TextOut(200,70,数值微分画线); MPLine(100,120,200,140,255,pDC);/中点画线法 pDC-

4、TextOut(200,140,中点画线); BHLine(100,140,200,190,255,pDC);/Bresenham画线法 pDC-TextOut(200,190,Bresenham画线法); / TODO: add draw code for native data here运行结果:2、圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC+实现算法,圆的生成算法实验内容:用中点画圆法、Bresenham画圆法/ CCircleView drawingvoid WholeCircle(int xc,int yc,int x,int y,int color,CDC*pDC)

5、pDC-SetPixel(xc+x,yc+y,color); pDC-SetPixel(xc-x,yc+y,color); pDC-SetPixel(xc+x,yc-y,color); pDC-SetPixel(xc-x,yc-y,color); pDC-SetPixel(xc+y,yc+x,color); pDC-SetPixel(xc-y,yc+x,color); pDC-SetPixel(xc+y,yc-x,color); pDC-SetPixel(xc-y,yc-x,color);void MidCircle(int xc,int yc,int r,int color,CDC*pDC

6、)/中点画圆法 int x,y,d; x=0;y=r;d=1-r; WholeCircle(xc,yc,x,y,color,pDC); while(x=y) if(d0) d+=2*x+3;x+; else d+=2*(x-y)+5;x+; y-; WholeCircle(xc,yc,x,y,color,pDC); WholeCircle(xc,yc,x,y,color,pDC);void BresenhamCircle(int xc,int yc,int r,int color,CDC*pDC)/Bresenham画圆法 int x,y,d; x=0; y=r; d=3-2*r; while

7、(xy) WholeCircle(xc,yc,x,y,color,pDC); if(dTextOut(175,100,中点画圆法); BresenhamCircle(100,250, 80, 255,pDC);/Bresenham画圆法 pDC-TextOut(185,250,Bresenham画圆法); / TODO: add draw code for native data here运行结果:3、椭圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC+实现算法,椭圆的生成算法实验内容:实现椭圆的算法/ CMPEllipseView drawingvoid WholeEllipse(i

8、nt xc,int yc,int x,int y,int color,CDC*pDC) pDC-SetPixel(xc+x,yc+y,color); pDC-SetPixel(xc+x,yc-y,color); pDC-SetPixel(xc-x,yc+y,color); pDC-SetPixel(xc-x,yc-y,color);void MidEllipse(int xc,int yc,int a,int b,int color,CDC*pDC) int aa=a*a, bb=b*b; int twoaa=2*aa, twobb=2*bb; int x=0, y=b; int dx=0,

9、dy=twoaa*y; int d=(int)(bb+aa*(-b+0.25)+0.5); WholeEllipse(xc,yc,x,y,color,pDC); while(dxdy) x+; dx+=twobb; if(d0) y-; dy-=twoaa; if(d0) d+=aa-dy; else x+;dx+=twobb; d+=aa-dy+dx; WholeEllipse(xc,yc,x,y,color,pDC); void CMPEllipseView:OnDraw(CDC* pDC) CMPEllipseDoc* pDoc = GetDocument(); ASSERT_VALID

10、(pDoc); MidEllipse(200,100,100,50,255, pDC); pDC-TextOut(305,100,中点画椭圆法); / TODO: add draw code for native data here运行结果:4. 有序边表填充算法程序设计实验目的:掌握用C/WIN-TC/VC+实现算法,有序边生成算法实验内容:实现有序边填充算法代码如下:#define WINDOW_HEIGHT 480#define NULL 0typedef struct tEdge /* 有序便表和活化边表的结构 */ int ymax; float x,dx; struct tEdge

11、 *next; Edge;typedef struct point int x,y; tPOINT;void InsertEdge(Edge *list,Edge *edge) Edge *p,*q = list; p = q-next; while(p) if (edge-x x) p = NULL; else q = p; p = p-next; edge-next = q-next; q-next = edge;int yNext(int k,int cnt,tPOINT *pts) int j; if (k+1)(cnt-1) j = 0; else j = k+1; while(pt

12、sk.y = ptsj.y) if (j+1) (cnt-1) j = 0; else j+; return ptsj.y;void MakeEdgeRec(tPOINT lower,tPOINT upper,int yComp,Edge *edge,Edge *edges) /* 生成有序边表的一条边 */ edge-dx = (float)(upper.x - lower.x)/(upper.y - lower.y); edge-x = lower.x; if (upper.y ymax = upper.y - 1; else edge-ymax = upper.y; InsertEdge

13、(edgeslower.y,edge);void BuildEdgeList(int cnt,tPOINT *pts,Edge *edges) Edge *edge; tPOINT v1,v2; int i,yPrev = ptscnt-2.y; v1.x = ptscnt-1.x; v1.y = ptscnt-1.y; for (i = 0;i cnt;i+) v2 = ptsi; if (v1.y != v2.y) edge = (Edge *)malloc(sizeof(Edge); /* C语言中的malloc */ if (v1.y next; while (p) q = p-nex

14、t; InsertEdge(active,p); p = q; void FillScan(int scan,Edge *active,int color,CDC *pDC) int i; Edge *p1,*p2; p1 = active-next; while(p1) p2 = p1-next; for (i = p1-x;i x;i+) pDC-SetPixel(int)i,scan,color); p1 = p2-next; void DeletAfter(Edge *q) Edge *p = q-next; q-next = p-next; free(p);void UpdateAc

15、tiveList(int scan,Edge *active) Edge *q = active,*p = active-next; while(p) if (scan = p-ymax) p = p-next; DeletAfter(q); else p-x = p-x + p-dx; q = p; p = p-next; void ResortActiveList(Edge *active) Edge *q,*p = active-next; active-next = NULL; while(p) q = p-next; InsertEdge(active,p); p = q; void

16、 ScanFill(int cnt,tPOINT *pts,int color,CDC *pDC) Edge *edgesWINDOW_HEIGHT,*active; int i,scan,scanmax = 0,scanmin = WINDOW_HEIGHT; for (i = 0;i cnt-1;i+) if (scanmax ptsi.y) scanmin = ptsi.y; for (scan = scanmin;scan next = NULL; BuildEdgeList(cnt,pts,edges); active = (Edge *)malloc(sizeof(Edge); a

17、ctive-next = NULL; for (scan = scanmin;scan next) FillScan(scan,active,color,pDC); UpdateActiveList(scan,active); ResortActiveList(active); CFillView:CFillView() / TODO: add construction code hereCFillView:CFillView()BOOL CFillView:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or

18、 styles here by modifying / the CREATESTRUCT cs return CView:PreCreateWindow(cs);/ CFillView drawingvoid CFillView:OnDraw(CDC* pDC) CFillDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here tPOINT points3=100,80,300,100,300,260; tPOINT *p = points; int color = RG

19、B(255,2,0); ScanFill(3,p,color,pDC); 运行结果:8.Cohen-SutherLand编码裁剪算法程序设计#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8typedef struct point int x,y; POINT1;void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT,CDC *pDC) int c=0; if(xXR) c=c|RIGHT; if (yYT) c=c|TOP; (*code)=c;void C

20、_S_Line(POINT p1,POINT p2,int XL,int XR,int YB,int YT,CDC *pDC) int x1,x2,y1,y2,x,y; int code1,code2,code; x1=p1.x;x2=p2.x;y1=p1.y;y2=p2.y; Encode(x1,y1,&code1,XL,XR,YB,YT,pDC); Encode(x2,y2,&code2,XL,XR,YB,YT,pDC); while(code1!=0 | code2!=0) if (code1 & code2) !=0) return; code=code1; if (code1=0)

21、code=code2; if (LEFT & code) !=0) x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1); else if(RIGHT & code)!=0) x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1); else if(BOTTOM & code) != 0) y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1); else if(TOP & code)!=0) y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1); if(code=code1) x1=x; y1=y; Encode(x,y,&code

22、1,XL,XR,YB,YT,pDC); else x2=x; y2=y; Encode(x,y,&code2,XL,XR,YB,YT,pDC); p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2; pDC-MoveTo(p1.x,p1.y); pDC-LineTo(p2.x,p2.y);void CCohenView:OnDraw(CDC* pDC) CCohenDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); POINT p1,p2,p3,p4,p5,p6,p7,p8; p1.x=35;p1.y=160; p2.x=245;p2.y=

23、121; p3.x=120;p3.y=60; p4.x=200;p4.y=300; p5.x=169;p5.y=45; p6.x=150;p6.y=200; p7.x=120;p7.y=200; p8.x=220;p8.y=130; pDC-LineTo(120,100); pDC-LineTo(210,100); pDC-LineTo(220,180); pDC-LineTo(120,170); pDC-LineTo(110,100); C_S_Line(p1,p2,100,200,90,170,pDC); C_S_Line(p3,p4,100,200,90,170,pDC);运行结果:6.

24、基于链队列的种子填充算法程序设计程序代码:#define NULL 0typedef struct point int x,y;POINT1;typedef struct QNode POINT Data; struct QNode *Next;QNode,*QPtr;typedef struct QPtr Front; QPtr Rear;LinkQueue;LinkQueue q;void CreateQueue() q.Front=q.Rear=(QPtr)malloc(sizeof(QNode); q.Rear-Next=NULL;POINT Dequeue() QNode *p;POINT x; p=q.Front;x=q.Front-Data;q.Front=q.Front-Next;free(p); return x;void Enqueue(POINT x) QNode *p=(QPtr)mall

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

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