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