您好,欢迎来到尚佳旅游分享网。
搜索
您的当前位置:首页opengl实验报告

opengl实验报告

来源:尚佳旅游分享网

opengl实验报告

课程名称:计算机图形学实验类型:上机

实验项目名称:实现五边形的扫描转换算法

学生姓名:_单晨鑫__专业:软件工程学号:指导老师:段鸿

实验地点:院系专用教室实验日期:_2012-04-03_

一、实验目的

编程实现五边形的扫描转换算法。(非自交的五个点,可以不用检测)

二、实验内容

实现任意一个非自交五边形的扫描转换(要求采用扫描线算法)(只能用OpenGL的画点函数)

1.五边形的五个点应可以自行指定(指定方式不限,但用户给定的五个顶点要满足非自交条件,因此程序不用做自交判断)

2.填充颜色应可指定,指定完屏幕自动刷清。函数直接画,否则此项为0分,只能用画点方式画GL_POINTS;

上述步骤可以用OpenGL的点画方式GL_POINTS实现;

三、实验环境

系统:Windows_P或者Windows7

软件:VC++6.0或者VS

四、实验中遇到的主要问题及其解决方式

问题1:五边形的边表的建立,活动边表的建立

解决方式:耐心慢慢的检查

五、源代码

边表和活动边表建立和画点算法

定义结构体用于活性边表AEL和边表ET

typedefstruct_ET{float_;floatd_,yma_;_ETne_t;}ET,AEL;

定义点结构体point

structpoint{float_;floaty;}polypoint[POINTNUM]={100,200,250,100,400,250,400,400,100,400};polypoint[POINTNUM]={250,50,550,150,550,400,250,250,100,350};多边形顶点mypoint[POINTNUM]={100,100,200,100,200,200,100,200};正方形

glBegin(GL_POINTS);

计算最高点的y坐标(扫描到此结束)

intMa_Y=0;inti;for(i=0;iMa_Y)Ma_Y=polypoint[i].y;

初始化AEL表

AELpAEL=newAEL;pAEL->ne_t=NULL;

初始化ET表

ETpET[1024];for(i=0;i<=Ma_Y;i++){}pET[i]=newET;pET[i]->ne_t=NULL;

扫描并建立ET表

for(i=0;i<=Ma_Y;i++){for(intj=0;jpolypoint[j].y){ETp=newET;p->_=polypoint[j]._;p->yma_=polypoint[(j-1+POINTNUM)%POINTNUM].y;p->d_=(polypoint[(j-1+POINTNUM)%POINTNUM]._-polypoint[j]._)/(polypoint[(j-1+POINTNUM)%POINTNUM].y-polypoint[j].y);

}if(polypoint[(j+1+POINTNUM)%POINTNUM].y>polypoint[j].y){ETp=newET;p->_=polypoint[j]._;p->yma_=polypoint[(j+1+POINTNUM)%POINTNUM].y;p->ne_t=pET[i]->ne_t;pET[i]->ne_t=p;

p->d_=(polypoint[(j+1+POINTNUM)%POINTNUM]._-polypoint[j]._)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);

}}}p->ne_t=pET[i]->ne_t;pET[i]->ne_t=p;

建立并更新活性边表AEL

for(i=0;i<=Ma_Y;i++){计算新的交点_,更新AELETp=pAEL->ne_t;while(p){}p->_=p->_+p->d_;p=p->ne_t;更新后新AEL先排序断表排序,不再开辟空间AELtq=pAEL;p=pAEL->ne_t;tq->ne_t=NULL;while(p){while(tq->ne_tp->_>=tq->ne_t->_)tq=tq->ne_t;ETs=p->ne_t;p->ne_t=tq->ne_t;tq->ne_t=p;p=s;

}tq=pAEL;AELq=pAEL;p=q->ne_t;while(p){}if(p->yma_==i){}else{}q=q->ne_t;p=q->ne_t;q->ne_t=p->ne_t;deletep;p=q->ne_t;将ET中的新点加入AEL,并用插入法按_值递增排序p=pET[i]->ne_t;q=pAEL;while(p){while(q->ne_tp->_>=q->ne_t->_)q=q->ne_t;ETs=p->ne_t;p->ne_t=q->ne_t;q->ne_t=p;p=s;

}q=pAEL;

像素填充颜色

六、}程序流程图p=pAEL->ne_t;while(pp->ne_t){}for(floatj=p->_;j<=p->ne_t->_;j++)glVerte_2i((int)j,i);p=p->ne_t->ne_t;考虑端点情况

画线算法

1、构造基本的数据结构;

2、建立更新边表和活动边表;

3、根据活动边表画出其中的点;

4、结束画布。

七、实验总结

这次实验让我们了解到多边形的构造以及点分解过程以及扫描线算法,在效率上更有优势,但是比较复杂。

Copyright © 2019- shangjiatang.cn 版权所有 湘ICP备2022005869号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务