计算机图形学实验报告实验2裁剪算法实验

  • 格式:docx
  • 大小:65.18 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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(maxxXR||maxyYT) return 1;

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;