多边形裁剪

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学实验》报告

任课教师:钱文华

2016年春季学期

实验:多边形裁剪

实验时间:2016年11月10日

实验地点:信息学院2204

实验目的:掌握多边形裁剪

程序代码:

#include

#include

#include

class wcPt2D{

public:

GLfloat x,y;

};

typedef enum

{

Left,Right,Bottom,Top

}Boundary;

int Inside(wcPt2D p,Boundary b,wcPt2D wMin,wcPt2D wMax) {

switch(b)

{

case Left:

if(p.x

break;

case Right:

if(p.x>wMax.x) return (false);

break;

case Bottom:

if(p.y

break;

case Top:

if(p.y>wMax.y) return (false);

break;

}

return true;

}

int Cross(wcPt2D p1,wcPt2D p2,Boundary b,wcPt2D wMin,wcPt2D wMax)

{

if(Inside(p1,b,wMin,wMax)==Inside(p2,b,wMin,wMax))

return (false);

else

return true;

}

wcPt2D Intersect(wcPt2D p1,wcPt2D p2,Boundary b,wcPt2D wMin,wcPt2D wMax)

{

wcPt2D iPt;

float m;

if(p1.x !=p2.x) m=(p2.y-p1.y)/(p2.x-p1.x);

switch(b){

case Left:

iPt.x=wMin.x;

iPt.y=p2.y+(wMin.x-p2.x)*m;

break;

case Right:

iPt.x=wMax.x;

iPt.y=p2.y+(wMax.x-p2.x)*m;

break;

case Bottom:

iPt.y=wMin.y;

if(p1.x!=p2.x)iPt.x=p2.x + (wMin.y-p2.y)/m;

else iPt.x=p2.x;

break;

case Top:

iPt.y=wMax.y;

if(p1.x!=p2.x) iPt.x=p2.x+(wMax.y-p2.y)/m;

else iPt.x=p2.x;

break;

}

return iPt;

}

int edgeCliper(Boundary b,wcPt2D wMin,wcPt2D wMax,wcPt2D *pIn,int cnt,wcPt2D *pOut)

{

wcPt2D s;

int i,Outcnt=0;

s=pIn[0];

for(i=1;i<=cnt;i++)

{

if(!Inside(s,b,wMin,wMax)&&Inside(pIn[i],b,wMin,wMax))

{

pOut[Outcnt]=Intersect(s,pIn[i],b,wMin,wMax);

Outcnt++;

pOut[Outcnt]=pIn[i];

Outcnt++;

}

else

if(Inside(s,b,wMin,wMax)&&Inside(pIn[i],b,wMin,wMax)) {

pOut[Outcnt]=pIn[i];

Outcnt++;

}

else

if(Inside(s,b,wMin,wMax)&&(!Inside(pIn[i],b,wMin,wMax))) {

pOut[Outcnt]=Intersect(s, pIn[i], b,wMin, wMax);

Outcnt++;

}

s=pIn[i];

}

return (Outcnt);

}

void init (void)

{

glClearColor(1.0,1.0,1.0,0.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(-400.0,400.0,-300.0,300.0);

}

void ClipPolygonSuthHodg(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

int i,cnt,Outcnt,b;

wcPt2D

points[8]={{-300,-100},{-300,150},{-100,150},{-100,100},{100,100},{1 00,0},{0,-100},{-300,-100}};

cnt=7;

wcPt2D pOut[28] ,pIn[28];

wcPt2D wMin={-200,0},wMax={50,200};

for(i=0; i<4*cnt; i++)

{

pIn[i].x=0.0;

pIn[i].y=0.0;

pOut[i].x=0.0;

pOut[i].y=0.0;

}

相关文档
最新文档