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