计算机图形学实验报告实验2裁剪算法实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的:
直线段的裁剪:编码裁剪算法,中点分割裁剪算法。
二、实验内容:
//BasicGraph.cpp
//请将下列裁剪程序补充完整,并用注释说明是何种裁剪算法
void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT) {
//请将此程序补充完整
int c=0;
if(x else if(x>XR) c=c|RIGHT; if(y else if(y>YT) c=c|TOP; (*code)=c; } //编码裁剪算法: void C_S_Line(POINT &p1,POINT &p2,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int x1,x2,y1,y2,x,y,code1,code2,code; x1=p1.x; x2=p2.x; y1=p1.y; y2=p2.y; Encode(x1,y1,&code1,XL,XR,YB,YT); Encode(x2,y2,&code2,XL,XR,YB,YT); 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);} else if((RIGHT&code)!=0) {x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);} 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,&code1,XL,XR,YB,YT);} else {x2=x;y2=y;Encode(x,y,&code2,XL,XR,YB,YT);} } p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2; } int IsInArea(POINT point,int XL,int XR,int YB,int YT) { //请将此程序补充完整 if(point.x>=XL && point.x<=XR && point.y>YB && point.y else return 0; } int NotIntersect(POINT begin,POINT end,int XL,int XR,int YB,int YT) { //请将此程序补充完整 int maxx,maxy,minx,miny; maxx=(begin.x>end.x)?begin.x:end.x; minx=(begin.x maxy=(begin.y>end.y)?begin.y:end.y; miny=(begin.y if(maxx else return 0; } //中点裁剪算法: POINT ClipMid(POINT begin,POINT end,int XL,int XR,int YB,int YT) { //请将此程序补充完整 POINT mid,temp; if(IsInArea(begin,XL,XR,YB,YT)) temp=begin; else if(NotIntersect(begin,end,XL,XR,YB,YT)) temp=begin; else { mid.x=(begin.x+end.x)/2;mid.y=(begin.y+end.y)/2; if(abs(mid.x-end.x)<=1&& abs(mid.y-end.y)<=1) temp=mid; else { if(NotIntersect(begin,mid,XL,XR,YB,YT)) temp=ClipMid(mid,end,XL,XR,YB,YT); else temp=ClipMid(begin,mid,XL,XR,YB,YT); } } return temp; } //Liang-Barsky直线裁剪算法: void ClipParameter(POINT &p1,POINT &p2,int XL,int XR,int YB,int YT) { float u1=0.0,u2=1.0; float dx=p2.x-p1.x,dy=p2.y-p1.y; if(clipTest(-dx,p1.x-XL,&u1,&u2)) if(clipTest(dx,XR-p1.x,&u1,&u2)) if(clipTest(-dy,p1.y-YB,&u1,&u2)) if(clipTest(dy,YT-p1.y,&u1,&u2)) { if(u2<1.0) { p2.x=p1.x+u2*dx; p2.y=p1.y+u2*dy; } if(u1>0.0) { p1.x=p1.x+u1*dx; p1.y=p1.y+u1*dy; } } } int clipTest(float p,float q,float *u1,float *u2) { float r; int remainFlag=1; if(p<0.0) { r=q/p; if(r>*u2) remainFlag=0; else if(r>*u1) *u1=r; } else if(p>0.0) { r=q/p; if(r<*u1) remainFlag=0; else if(r<*u2) *u2=r; } else //*p=0 if(q<0.0) remainFlag=0;