实验4:直线或多边形裁剪_第1页
实验4:直线或多边形裁剪_第2页
实验4:直线或多边形裁剪_第3页
实验4:直线或多边形裁剪_第4页
全文预览已结束

付费下载

下载本文档

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

文档简介

计算机图形学实验报告实验4:直线或多边形裁剪实验目的:实现标准矩形窗口的裁剪,窗口由键盘输入或鼠标确定,直线/多边形都是任意的。裁剪后的图形要准确,不能多或者少点。实验内容及要求:对于直线/多边形的裁剪实验,要求实现标准矩形窗口的裁剪,窗口由键盘输入或鼠标确定,直线/多边形都是任意的。裁剪后的图形要准确,不能多或者少点。对于上述两个实验都要求掌握各自算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。实验原理:实验代码:#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<graphics.h>typedefstruct{floatx,y;}Point;voidinitgraphics(void);voidCode(PointFrameLT,PointFrameRB,PointP,unsignedchar*Flag);voidClipping(PointFrameLT,PointFrameRB,PointLineSP,PointLineEP);voidmain(void){PointFrameLT,FrameRB;PointP[3];initgraphics();setcolor(RED);FrameLT.x=200;FrameLT.y=100;FrameRB.x=460;FrameRB.y=360;rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameRB.y);P[0].x=330;P[0].y=80;P[1].x=150;P[1].y=300;P[2].x=510;P[2].y=200;line((int)P[0].x,(int)P[0].y,(int)P[1].x,(int)P[1].y);line((int)P[0].x,(int)P[0].y,(int)P[2].x,(int)P[2].y);line((int)P[1].x,(int)P[1].y,(int)P[2].x,(int)P[2].y);getch();cleardevice();rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameRB.y);Clipping(FrameLT,FrameRB,P[0],P[1]);Clipping(FrameLT,FrameRB,P[0],P[2]);Clipping(FrameLT,FrameRB,P[1],P[2]);getch();closegraph();}voidinitgraphics(void){intdriver=VGA,mode=VGAHI;interrcode;initgraph(&driver,&mode,"");if((errcode=graphresult())!=0){printf("Graphicserror:%s\n",grapherrormsg(errcode));exit(1);}}voidCode(PointFrameLT,PointFrameRB,PointP,unsignedchar*Flag){unsignedcharflag=0;if(P.x<FrameLT.x)flag+=1;if(P.x>FrameRB.x)flag+=2;if(P.y>FrameRB.y)flag+=4;if(P.y<FrameLT.y)flag+=8;(*Flag)=flag;}voidClipping(PointFrameLT,PointFrameRB,PointLineSP,PointLineEP){unsignedcharflagSP,flagEP,flagAND,flagOR;doublek=(LineEP.y-LineSP.y)/(LineEP.x-LineSP.x);Code(FrameLT,FrameRB,LineSP,&flagSP);Code(FrameLT,FrameRB,LineEP,&flagEP);flagAND=flagSP&flagEP;if(flagAND!=0)return;while(flagSP!=0||flagEP!=0){flagOR=flagSP|flagEP;if((flagOR&0x01)==1){if((flagSP&0x01)==1){LineSP.y=LineSP.y+k*(FrameLT.x-LineSP.x);LineSP.x=FrameLT.x;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=LineEP.y+k*(FrameLT.x-LineEP.x);LineEP.x=FrameLT.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x02)==2){if((flagSP&0x02)==2){LineSP.y=LineSP.y+k*(FrameRB.x-LineSP.x);LineSP.x=FrameRB.x;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=LineEP.y+k*(FrameRB.x-LineEP.x);LineEP.x=FrameRB.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x04)==4){if((flagSP&0x04)==4){LineSP.x=LineSP.x+(FrameRB.y-LineSP.y)/k;LineSP.y=FrameRB.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=LineEP.x+(FrameRB.y-LineEP.y)/k;LineEP.y=FrameRB.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x08)==8){if((flagSP&0x08)==8){LineSP.x=LineSP.x+(FrameLT.y-LineSP.y)/k;LineSP.y=FrameLT.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=LineEP.x+(FrameLT.y-LineEP.y)/k;LineEP.y=FrameLT.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}flagAND=flagSP&flagEP;if(flagAND!=0)return;}line((int)LineSP.x,(int)LineSP.y,(int)

温馨提示

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

最新文档

评论

0/150

提交评论