图形学实验报告_第1页
图形学实验报告_第2页
图形学实验报告_第3页
图形学实验报告_第4页
图形学实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

计算机图形学实验报告直线的生成程序设计:实验目的:掌握直线段的生成算法,并用C/WIN-TC/VC++实现算法,包括中点法生成直线,微分数值法生成直线段等。实验内容:用不同的方法生成斜率不同的直线段,比拟各种方法的效果。///////////////////////////////////////////////////////////////////////////////CLineViewdrawingvoidDDALine(intx1,inty1,intx2,inty2,intcolor,CDC*pDC)//数值微分法{intx;intk,y=y1;k=1.0*(y2-y1)/(x2-x1);for(x=x1;x<=x2;x++){pDC->SetPixel(x,(int)(y+0.5),color);y=y+k;}}voidMPLine(intx1,inty1,intx2,inty2,intcolor,CDC*pDC)//中点画线法{intx,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(d<0) {y++;d+=d2;}else{d+=d1;}pDC->SetPixel(x,y,color);}}voidBHLine(intx1,inty1,intx2,inty2,intcolor,CDC*pDC)//Bresenham画线法{intx,y,dx,dy,dk;dx=abs(x2-x1);dy=abs(y2-y1);dk=2*dy-dx;y=y1;for(x=x1;x<=x2;x++){ pDC->SetPixel(x,y,color);dk=dk+2*dy;if(dk>=0) {y++;dk=dk-2*dx;}}}voidCLineView::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->TextOut(200,140,"中点画线");BHLine(100,140,200,190,255,pDC);//Bresenham画线法 pDC->TextOut(200,190,"Bresenham画线法"); //TODO:adddrawcodefornativedatahere}运行结果:2、圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC++实现算法,圆的生成算法实验内容:用中点画圆法、Bresenham画圆法///////////////////////////////////////////////////////////////////////////////CCircleViewdrawingvoidWholeCircle(intxc,intyc,intx,inty,intcolor,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);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);}voidMidCircle(intxc,intyc,intr,intcolor,CDC*pDC)//中点画圆法{intx,y,d;x=0;y=r;d=1-r;WholeCircle(xc,yc,x,y,color,pDC);while(x<=y){if(d<0){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);}voidBresenhamCircle(intxc,intyc,intr,intcolor,CDC*pDC)//Bresenham画圆法{intx,y,d;x=0;y=r;d=3-2*r;while(x<y){WholeCircle(xc,yc,x,y,color,pDC);if(d<0) d=d+4*x+6;else{d=d+4*(x-y)+10;y--;}x++;}if(x==y)WholeCircle(xc,yc,x,y,color,pDC);}voidCCircleView::OnDraw(CDC*pDC){ CCircleDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); MidCircle(100,100,70,255,pDC);//中点画圆法 pDC->TextOut(175,100,"中点画圆法"); BresenhamCircle(100,250,80,255,pDC);//Bresenham画圆法 pDC->TextOut(185,250,"Bresenham画圆法"); //TODO:adddrawcodefornativedatahere}运行结果:3、椭圆的生成程序设计:实验目的:掌握用C/WIN-TC/VC++实现算法,椭圆的生成算法实验内容:实现椭圆的算法//CMPEllipseViewdrawingvoidWholeEllipse(intxc,intyc,intx,inty,intcolor,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);}voidMidEllipse(intxc,intyc,inta,intb,intcolor,CDC*pDC){intaa=a*a,bb=b*b;inttwoaa=2*aa,twobb=2*bb;intx=0,y=b;intdx=0,dy=twoaa*y;intd=(int)(bb+aa*(-b+0.25)+0.5);WholeEllipse(xc,yc,x,y,color,pDC);while(dx<dy){ x++;dx+=twobb; if(d<0) d+=bb+dx; else {y--;dy-=twoaa;d+=bb+dx-dy;}WholeEllipse(xc,yc,x,y,color,pDC);}d=(int)(bb*(x+0.5)*(x+0.5)+aa*(y-1)*(y-1)-aa*bb+0.5);while(y>0){ y--;dy-=twoaa; if(d>0) d+=aa-dy; else {x++;dx+=twobb;d+=aa-dy+dx;}WholeEllipse(xc,yc,x,y,color,pDC);}}voidCMPEllipseView::OnDraw(CDC*pDC){ CMPEllipseDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); MidEllipse(200,100,100,50,255,pDC); pDC->TextOut(305,100,"中点画椭圆法"); //TODO:adddrawcodefornativedatahere}运行结果:4.有序边表填充算法程序设计实验目的:掌握用C/WIN-TC/VC++实现算法,有序边生成算法实验内容:实现有序边填充算法代码如下:#defineWINDOW_HEIGHT480#defineNULL0typedefstructtEdge/*有序便表和活化边表的结构*/{ intymax; floatx,dx; structtEdge*next;}Edge;typedefstructpoint{ intx,y;}tPOINT;voidInsertEdge(Edge*list,Edge*edge){ Edge*p,*q=list; p=q->next; while(p) { if(edge->x<p->x) { p=NULL; } else { q=p; p=p->next; } } edge->next=q->next; q->next=edge;}intyNext(intk,intcnt,tPOINT*pts){ intj; if((k+1)>(cnt-1)) { j=0; } else { j=k+1; } while(pts[k].y==pts[j].y) {if((j+1)>(cnt-1)) {j=0;} else {j++; } } returnpts[j].y;}voidMakeEdgeRec(tPOINTlower,tPOINTupper,intyComp,Edge*edge,Edge*edges[])/*生成有序边表的一条边*/{ edge->dx=(float)(upper.x-lower.x)/(upper.y-lower.y); edge->x=lower.x; if(upper.y<yComp) { edge->ymax=upper.y-1; } else { edge->ymax=upper.y; } InsertEdge(edges[lower.y],edge);}voidBuildEdgeList(intcnt,tPOINT*pts,Edge*edges[]){Edge*edge; tPOINTv1,v2; inti,yPrev=pts[cnt-2].y; v1.x=pts[cnt-1].x; v1.y=pts[cnt-1].y; for(i=0;i<cnt;i++) { v2=pts[i]; if(v1.y!=v2.y) { edge=(Edge*)malloc(sizeof(Edge));/*C语言中的malloc*/ if(v1.y<v2.y) { MakeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges); } else { MakeEdgeRec(v2,v1,yPrev,edge,edges); } yPrev=v1.y; v1=v2; } }}voidBuildActiveList(intscan,Edge*active,Edge*edges[]){ Edge*p,*q; p=edges[scan]->next; while(p) { q=p->next; InsertEdge(active,p); p=q; }}voidFillScan(intscan,Edge*active,intcolor,CDC*pDC){ inti; Edge*p1,*p2; p1=active->next; while(p1) { p2=p1->next; for(i=p1->x;i<p2->x;i++) { pDC->SetPixel((int)i,scan,color); } p1=p2->next; }}voidDeletAfter(Edge*q){ Edge*p=q->next; q->next=p->next; free(p);}voidUpdateActiveList(intscan,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; } }}voidResortActiveList(Edge*active){ Edge*q,*p=active->next; active->next=NULL; while(p) { q=p->next; InsertEdge(active,p); p=q; }}voidScanFill(intcnt,tPOINT*pts,intcolor,CDC*pDC){ Edge*edges[WINDOW_HEIGHT],*active; inti,scan,scanmax=0,scanmin=WINDOW_HEIGHT; for(i=0;i<cnt-1;i++) { if(scanmax<pts[i].y) { scanmax=pts[i].y; } if(scanmin>pts[i].y) { scanmin=pts[i].y; } } for(scan=scanmin;scan<=scanmax;scan++) { edges[scan]=(Edge*)malloc(sizeof(Edge)); edges[scan]->next=NULL; } BuildEdgeList(cnt,pts,edges); active=(Edge*)malloc(sizeof(Edge)); active->next=NULL; for(scan=scanmin;scan<=scanmax;scan++) { BuildActiveList(scan,active,edges); if(active->next) { FillScan(scan,active,color,pDC); UpdateActiveList(scan,active); ResortActiveList(active); } }}CFillView::CFillView(){ //TODO:addconstructioncodehere}CFillView::~CFillView(){}BOOLCFillView::PreCreateWindow(CREATESTRUCT&cs){ //TODO:ModifytheWindowclassorstylesherebymodifying //theCREATESTRUCTcs returnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CFillViewdrawingvoidCFillView::OnDraw(CDC*pDC){ CFillDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); //TODO:adddrawcodefornativedatahere tPOINTpoints[3]={{100,80},{300,100},{300,260}}; tPOINT*p=points; intcolor=RGB(255,2,0); ScanFill(3,p,color,pDC);} 运行结果:8.Cohen-SutherLand编码裁剪算法程序设计#defineLEFT1#defineRIGHT2#defineBOTTOM4#defineTOP8typedefstructpoint{intx,y;}POINT1;voidEncode(intx,inty,int*code,intXL,intXR,intYB,intYT,CDC*pDC){intc=0;if(x<XL)c=c|LEFT;elseif(x>XR)c=c|RIGHT;if(y<YB)c=c|BOTTOM;elseif(y>YT)c=c|TOP;(*code)=c;}voidC_S_Line(POINTp1,POINTp2,intXL,intXR,intYB,intYT,CDC*pDC){intx1,x2,y1,y2,x,y;intcode1,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)code=code2; if((LEFT&code)!=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1); } elseif((RIGHT&code)!=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1); } elseif((BOTTOM&code)!=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1); } elseif((TOP&code)!=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1); }if(code==code1) { x1=x;y1=y; Encode(x,y,&code1,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);}voidCCohenView::OnDraw(CDC*pDC){ CCohenDoc*pDoc=GetDocument();ASSERT_VALID(pDoc); POINTp1,p2,p3,p4,p5,p6,p7,p8;p1.x=35;p1.y=160; p2.x=245;p2.y=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.基于链队列的种子填充算法程序设计程序代码:#defineNULL0typedefstructpoint{intx,y;}POINT1;typedefstructQNode{POINTData;structQNode*Next;}QNode,*QPtr;typedefstruct{QPtrFront;QPtrRear;}LinkQueue;LinkQueueq;voidCreateQueue(){q.Front=q.Rear=(QPtr)malloc(sizeof(QNode));q.Rear->Next=NULL;}POINTDequeue(){QNode*p;POINTx;p=q.Front;x=q.Front->Data;q.Front=q.Front->Next;free(p);returnx;}voidEnqueue(POINTx){QNode*p=(QPtr)malloc(sizeof(QNode));q.Rear->Next=p;q.Rear->Data=x;q.Rear=p;}intEmpty(){if(q.Front==q.Rear)return1;elsereturn0;}voidQueueSeedFill(intseedx,intseedy,intfcolor,intbcolor,CDC*pDC){intcolor;POINTpt,p,p1,p2,p3,p4;pDC->SetPixel(seedx,seedy,fcolor);p.x=seedx;p.y=seedy;Enqueue(p);while(!Empty()){ pt=Dequeue(); color=pDC->GetPixel(pt.x,pt.y-1); if(color!=bcolor&&color!=fcolor) { pDC->SetPixel(pt.x,pt.y-1,fcolor); p1.x=pt.x;p1.y=pt.y-1; Enqueue(p1); } color=pDC->GetPixel(pt.x,pt.y+1); if(color!=bcolor&&color!=fcolor) { pDC->SetPixel(pt.x,pt.y+1,fcolor); p2.x=pt.x;p2.y=pt.y+1; Enqueue(p2); } color=pDC->GetPixel(pt.x-1,pt.y); if(color!=bcolor&&color!=fcolor) { pDC->SetPixel(pt.x-1,pt.y,fcolor); p3.x=pt.x-1;p3.y=pt.y; Enqueue(p3); } color=pDC->GetPixel(pt.x+1,pt.y); if(color!=bcolor&&color!=fcolor) { pDC->SetPixel(pt.x+1,pt.y,fcolor); p4.x=pt.x+1;p4.y=pt.y; Enqueue(p4); }}}voidEdgeMark(intx1,inty1,intx2,inty2,intcolor,CDC*pDC){inti,length;floatdx,dy,x=x1,y=y1;if(abs(x2-x1)>=abs(y2-y1))length=abs(x2-x1);elselength=abs(y2-y1);dx=(float)(x2-x1)/length;dy=(float)(y2-y1)/length;pDC->SetPixel((int)(x+0.5),(int)(y+0.5),color);for(i=1;i<=length;i++){x=x+dx;y=y+dy; pDC->SetPixel((int)(x+0.5),(int)(y+0.5),color);}}voidQSeedFill(intcnt,POINT*pts,intseedx,intseedy,intfcolor,intbcolor,CDC*pDC){POINTv1,v2;inti;for(i=0;i<cnt-1;i++){v1=pts[i];v2=pts[i+1];EdgeMark(v1.x,v1.y,v2.x,v2.y,bcolor,pDC);}QueueSeedFill(seedx,seedy,fcolor,bcolor,pDC);}voidCQseedFillView::OnDraw(CDC*pDC){ CQseedFillDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);POINTpts[7];pts[0].x=40;pts[0].y=12;pts[1].x=75;pts[1].y=45;pts[2].x=110;pts[2].y=20;pts[3].x=130;pts[3].y=70;pts[4].x=80;pts[4].y=110;pts[5].x=25;pts[5].y=60;pts[6].x=40;pts[6].y=15;QSeedFill(8,pts,70,80,2,4,pDC);}运行结果:13.Bezier曲线绘制程序设计程序代码如下://CBezierViewdrawingtypedefstructpoint{intx,y;}POINT1;voidParabola(POINT*p,intn,CDC*pDC){intx,y,i,j,k=10;doublet1,t2,t3,t,a,b,c,d;p[n].x=p[n-1].x;p[n].y=p[n-1].y;t=0.5/k;pDC->MoveTo(p[1].x,p[1].y);for(i=1;i<n-1;i++){ for(j=1;j<k;j++) { t1=j*t;t2=t1*t1;t3=t2*t1; a=4.0*t2-t1-4.0*t3;b=1.0-10.0*t2+12.0*t3; c=t1+8.0*t2-12.0*t3;d=4.0*t3-2.0*t2; x=(int)(a*p[i-1].x+b*p[i].x+c*p[i+1].x+d*p[i+2].x); y=(int)(a*p[i-1].y+b*p[i].y+c*p[i+1].y+d*p[i+2].y); pDC->LineTo(x,y); } pDC->LineTo(p[i+1].x,p[i+1].y);}}doublepowi(doublev,intk){inti;doubletemp=1.0;if(k==0||v==0)return1;else{ for(i=1;i<=k;i++)temp=temp*v;}returntemp;}longfac(intm){inti;longtemp=1;if(m==0)return1;else{ for(i=2;i<=m;i++) temp=temp*i;}returntemp;}voidBezier(POINT*p,intn,CDC*pDC){intx,y,i,j,k=100;doublet,t1,u,v;doubletemp,temp1,temp2,bi;t=1.0/k;pDC->MoveTo(p[0].x,p[0].y);for(j=1;j<k;j++){ t1=j*t;u=t1;v=1-u;x=0;y=0; for(i=0;i<=n;i++) { temp=(double)fac(n)/fac(i)/fac(n-i); temp1=powi(u,i);temp2=powi(v,n-i); bi=temp*temp1*temp2; x=x+bi*p[i].x;y=y+bi*p[i].y; }pDC->LineTo(x,y);}pDC->LineTo(p[n].x,p[n].y);}voidBSpLine(POINT*p,intn,CDC*pDC){intx,y,i,j,k=1000;doublet,t1,t2,t3,a,b,c,d;t=1.0/k;p[n].x

温馨提示

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

评论

0/150

提交评论