计算机图形学Sutherland-Hodgman裁剪算法扩展三维裁剪
- 格式:doc
- 大小:390.50 KB
- 文档页数:11
else
return true;
}
wcPt3D Intersect(wcPt3D p1,wcPt3D p2,Boundary b,wcPt3D wMin,wcPt3D wMax)
{
wcPt3D iPt;
float m1,m2,m3,m4,m5,m6;
if(p1.x !=p2.x)
{
Outcnt=edgeCliper(Boundary(b),wMin,wMax,pIn,cnt,pOut);
for(i=0;i<Outcnt;i++)
pIn[i]=pOut[i];
pIn[Outcnt]=pOut[0];
cnt=Outcnt;
}
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
case Right:
iPt.x=wMax.x;
iPt.y=p1.y+(p2.y-p1.y)*m2;
iPt.z=p1.z+(p2.z-p1.z)*m2;
break;
case Bottom:
iPt.y=wMin.y;
iPt.x=p1.x+(p2.x-p1.x)*m3;
iPt.z=p1.z+(p2.z-p1.z)*m3;
{
wcPt3D 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);
glFlush();
}
void ClipPolygonSuthHodgxz(void) //在xz平面上投影函数
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
int i,cnt,Outcnt,b;
wcPt3D points[4]={{-100,-100,-100},{0,200,0},{200,0,0},{-100,-100,-100}};//被裁减三角形的三个顶点
{
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);
for(i=0; i<4*cnt; i++)
{
pIn[i].x=0.0;
pIn[i].y=0.0;
pIn[i].z=0.0;
pOut[i].x=0.0;
pOut[i].y=0.0;
if(p.z>wMax.z) return (false);
break;
}
return true;
}
int Cross(wcPt3D p1,wcPt3D p2,Boundary b,wcPt3D wMin,wcPt3D wMax)
{
if(Inside(p1,b,wMin,wMax)==Inside(p2,b,wMin,wMax))
break;
case Bottom:
if(p.y<wMin.y) return (false);
break;
case Top:
if(p.y>wMax.y) return (false);
break;
case Behind:
if(p.z<wMin.z) return (false);
break;
case Front:
三、实验要求
用C++实现上述内容。
四、实验过程
#include<GL/glut.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
float x,y,z;
}wcPt3D;
typedef enum
{
Left,Right,Bottom,Top,Behind,Front
{
m1=(wMin.x-p1.x)/(p2.x-p1.x);
m2=(wMax.x-p1.x)/(p2.x-p1.x);
}
if(p1.y !=p2.y)
{
m3=(wMin.y-p1.y)/(p2.y-p1.y);
m4=(wMax.y-p1.y)/(p2.y-p1.y);
}
if(p1.z !=p2.z)
pIn[i]=pOut[i];
pIn[Outcnt]=pOut[0];
cnt=Outcnt;
}
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<cnt;i++)
glVertex2f(pOut[i].x,pOut[i].y);
glEnd();
for(i=0;i<cnt;i++)
glVertex2f(pOut[i].x,pOut[i].z);
glEnd();
glFlush();
}
void ClipPolygonSuthHodgyz(void) //在yz平面上投影函数
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
break;
case Front:
iPt.z=wMax.z;
iPt.x=p1.x+(p2.x-p1.x)*m6;
iPt.y=p1.y+(p2.y-p1.y)*m6;
break;
}
return iPt;
}
int edgeCliper(Boundary b,wcPt3D wMin,wcPt3D wMax,wcPt3D *pIn,int cnt,wcPt3D *pOut)
glLoadIdentity();
glOrtho(-300.0,300.0,-300.0,300.0,-300.0,300.0);
}
void ClipPolygonSuthHodgxy(void) //在xy平面上投影函数
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
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)))
glVertex3f(wMin.x,wMax.y,wMax.z);
glEnd();
glLineWidth(3.0);
glBegin(GL_LINE_LOOP);
for(i=0;i<cnt;i++)
glVertex2f(pIn[i].x,pIn[i].z);
glEnd();
for(b=0;b<6;b++)
计算机图形学实验报告
学生所在学院:理学院
学生所在班级:
学生姓名:微博:nelfeck
指导教师:欢迎关注
教务处
2015 年5月
一、实验目的
在本实验中,要给表示场景中的多边形赋以“深度”,并使用规范化观察体队他们裁剪。
二、实验内容
首先,为你的应用场景的多边形选定新的z坐标轴及三维方向,即让他们从目前所在的平面离开,并给定适当的深度。然后,实现Sutherland-Hodgman裁剪算法的扩充版本,使其可以规范化对称观察体来凸多边形进行裁剪。
for(i=0; i<4*cnt; i++)
{
pIn[i].x=0.0;
pIn[i].y=0.0;
pIn[i].z=0.0;
pOut[i].x=0.0;
pOut[i].y=0.0;
pOut[i].z=0.0;
}
for(i=0; i<=cnt; i++) pIn[i]=points[i];
glColor3f(0.0,0.0,0.0);
}Boundary;
int Inside(wcPt3D p,Boundary b,wcPt3D wMin,wcPt3D wMax)
{
switch(b)
{
case Left:
if(p.x<wMin.x) return (false) ;
break;
case Right:
if(p.x>wMax.x) return (false);
glBegin(GL_LINE_LOOP);
for(i=0;i<cnt;i++)