OpenGL 实验2直线生成算法实现
更新时间:2024-03-29 13:09:01 阅读量: 综合文库 文档下载
- opengl是什么意思推荐度:
- 相关推荐
实验2 直线生成算法实现
1. 实验目的
理解基本图形元素光栅化的基本原理, 掌握一种基本图形元素光栅化算法, 利用0penGL实现直线光栅化的 DDA算法。
2. 实验内容
(1)根据所给的直线光栅化的示范源程序, 在计算机上编译运行, 输出正确结果。
(2)指出示范程序采用的算法, 以此为基础将其改造为中点线算法或 Bresenham算法,写入实验报告。
(3)根据示范代码,将其改造为圆的光栅化算法,写入实验报告。 (4)了解和使用 OpenGL的生成直线的命令,来验证程序运行结果。
3. 实验原理
示范代码原理DDA算法。下面介绍 OpenGL画线的一些基础知识和glutReshapeFunc()函数。
(1)数学上的直线没有宽度,但0penGL的直线则是有宽度的。同时, OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为, OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。这里的线由一系列顶点顺次连接而成, 有闭合和不闭合两种。
前面的实验已经知道如何绘“点”,那么 OpenGL是如何知道拿这些顶点来做什么呢? 是依次画出来,还是连成线? 或者构成一个多边形? 或是做其他事情? 为了解决这一问题, OpenGL要求:指定顶点的命令必须包含在 glBegin函数之后, glEnd函数之前(否则指定的顶点将被忽略),并由 glBegin来指明如何使用这些点。 例如:
glBegin(GL P0INTS) , glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.0f); glEnd();
则这两个点将分别被画出来。如果将 GL_POINTS替换成 GL_LINES,则两个点将被认为是直线的两个端点, OpenGL将会画出一条直线。还可以指定更多的顶点, 然后画出更复杂的图形。另一方面, glBegin支持的方式除了 GL_POINTS和 GL_LINES,还有GL LINE STRIP、 GL LINE L0〇P、 GL TRIANGLES、 GL TRIANGLE STRIP、 GL TRIANGLE_FAN等几何图元。
(2) 首次打开窗口、移动窗口和改变窗口大小时, 窗口系统都将发送一个事件, 以通知程序员。如果使用的是 GLUT,通知将自动完成,并调用向 glutReshapeFunc注册的函数。该函数必须完成下列工作:
①重新建立用作新渲染画布的矩形区域。 ②定义绘制物体时使用的坐标系。 如:
void Reshape(int w, int h) {
glViewport(0, 0, (GLsizei) w,(GLsizei) h);
glMatrixMode(GL_PROJECTION) ; glLoadIdentity() ;
gluOrtho2D(0.0, (GLdouble) w,0.0,(Gldouble)h); }
在 GLUT内部, 将给该函数传递两个参数: 窗口被移动或修改大小后的宽度和高度, 单位为像素。 glViewport()调整像素矩形,用于绘制整个窗口。接下来三个函数调整绘图坐标系,使左下角坐标为(0,0),右上角坐标为(w,h)。
4. 实验代码
#include
void SetPixel(int x,int y){//画点 glBegin(GL_POINTS); glVertex2i(x,y);//设置点坐标 glEnd(); }
void swap(int *a,int *b)//交换函数 { int temp=*a; *a=*b; *b=temp; }
int abs(int a,int b){ if(a>b) return (a-b); else return (b-a); }
void Bres_Line(int x0,int y0,int x1,int y1)//Bresenham算法 { glColor3f(1.0f,0.0f,0.0f); SetPixel(x0,y0); int dx=abs(x1,x0);//200 int dy=abs(y1,y0);//300 if(dx==0&&dy==0) return ; int flag=0; if(dx
int curx=x0; int cury=y0; int dS=2*dy; int dT=2*(dy-dx); int d=dS-dx; while(curx!=x1) { if(d<0) d+=dS; else { cury+=ty; d+=dT; } glPointSize(2); if(flag){ SetPixel(cury,curx); }else{ SetPixel(curx,cury); } curx+=tx; } }
void LineDDA(int x0,int y0,int x1,int y1/*,int color*/){ float x,y; float m,dy,dx; dx=x1-x0; dy=y1-y0; m=dy/dx; y=y0; glColor3f(1.0f,1.0f,1.0f); glPointSize(2); for(x=x0;x<=x1;x++){ SetPixel(x,(y+0.5)); y+=m; } }
void Cirpot(int x0,int y0,int x,int y){ SetPixel((x0+x),(y0+y)); SetPixel((x0+y),(y0+x)); SetPixel((x0+y),(y0-x));
SetPixel((x0+x),(y0-y)); SetPixel((x0-x),(y0-y)); SetPixel((x0-y),(y0-x)); SetPixel((x0-y),(y0+x)); SetPixel((x0-x),(y0+y)); }
void BresCricle(int x0,int y0,double r){ glColor3f(0.0f,0.0f,1.0f); int x,y,d; x=0; y=(int) r; d=int(3-2*r); while(x void myDisplay(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f,0.0f,1.0f); glRectf(25.0,25.0,75.0,75.0); glPointSize(1); glBegin(GL_POINTS); glColor3f(0.0f,1.0f,0.0f);glVertex2f(100.0f,200.0f); glEnd(); LineDDA(0,0,200,300);//点线 BresCricle(100,200,100); Bres_Line(0,0,300,100); glBegin(GL_LINES); glColor3f(1.0f,0.0f,0.0f);glVertex2f(100.0f,0.0f); glColor3f(0.0f,1.0f,0.0f);glVertex2f(180.0f,240.0f); glEnd(); glFlush(); } void Init(){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); } void Reshape(int w,int h){ glViewport(0,0,(GLsizei) w,(GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLdouble) w,0.0,(GLdouble) h);//坐标系定义 } int main(int argc,char *argv[]){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutInitWindowPosition(100,100); glutInitWindowSize(400,400); glutCreateWindow(\ Init(); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutMainLoop(); return 0; } 5. 实验结果 6. 实验分析 在书本中代码呈现出的直线是一条斜率为1的线,而按照数据,线条斜率为1.5,分析其原因是在LineDDA函数中,m,x,y等值的类型都为int型,造成了数据的丢失,所以斜率发生了变化。
正在阅读:
OpenGL 实验2直线生成算法实现03-29
(建筑工程管理)系统工程思考与练习题精编05-01
2016版最新整理苏教版四年级下册语文练习与测试答案12-26
如何申请高等教育学历认证?05-31
班主任工作精选随笔11-20
工业工程发展展望05-10
小括号的教学设计06-11
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 算法
- 直线
- 生成
- 实验
- 实现
- OpenGL
- 预收款后给客户开了发票,确认收入问题
- 八年级语文下册 第十六课 半途而废教案 新疆教育版
- 卡迪夫大学与格拉斯哥卡利多尼安大学哪个好 - 图文
- 与家长访谈记录
- 部编版《道德与法治》一年级上册第6课《校园里的号令》优质教案
- 2017届浙江省杭州市学军中学高三第九次月考语文试题及答案 - 图
- 采购业务流程及管理制度
- 2017年全国一级建造师《建设工程法规及相关知识》模考题(一)
- 教师专业成长实施方案
- 交通影响评价的有关资料 - 图文
- 西方经济学复习思考题(微经总结完善版)
- 广东省惠州市2019届高三4月模拟考试数学理试题
- 创先争优活动、党建工作、“六好”党支部经验交流材料(2)
- 王署霞 - 必修四情景默写
- 江苏省通州市通海中学2016届高三下期4月月考化学试卷 doc
- 大工11秋《建筑施工》在线作业1、2、3答案
- 山东省济宁市2008-2009学年度第一学期高三质量检测数学试题(理
- 1.1 中学生物学课程的性质、价值和地位 - 图文
- 五年级上册科学第一单元检测题答案
- 概率统计模拟试题3