计算机图形学E2——OpenGL Bresenham算法画直线
其他计算机图形学实验见 链接
要求
使用Bresemham算法画直线,并且通过鼠标可以实现交互操作
参考代码:
代码1
代码2
代码3(代码好理解)
代码4(讲解很全面)
#include<iostream>
#include<GL/glut.h>
using namespace std;int bx, by, ex, ey;//划线的起止点坐标
int window_width = 800, window_height = 600;void swap(GLint& a, GLint& b)
{ GLint t = a;a = b; b = t;
}
void draw_a_point(GLint x, GLint y)
{glBegin(GL_POINTS);glVertex2i(x, y);glEnd();
}void bresenham(GLint x1, GLint y1, GLint x2, GLint y2)
{glClear(GL_COLOR_BUFFER_BIT);draw_a_point(x1, y1);int dx = abs(x1 - x2);int dy = abs(y1 - y2);int flag = 0;//表示当前斜率k的绝对值是否大于1if (dx == 0 && dy == 0)return;if (dy > dx)//斜率绝对值大于1{flag = 1;//横纵坐标轴互换,将x视作y,将y视作x,所有坐标都需要互换swap(x1, y1);swap(x2, y2);swap(dx, dy);}//确定步长tx,ty,斜率为正或为负,且只考虑左/右上or左/右下,左/右边的情况不加步长即可int tx = x2 > x1 ? 1 : -1;int ty = y2 > y1 ? 1 : -1;//确定下一个点的坐标x,yint x = x1 + 1;int y = y1;//dt和ds由迭代公式推出。dt是右上的点,ds是右边的点int dt = 2 * (dy - dx);int ds = 2 * dy;//判别式的值int d = ds - dx;while (x != x2){if (d >= 0)//选T点(右上的点{d += dt;y += ty;}else{d += ds;}if (flag)//斜率大于1draw_a_point(y, x);elsedraw_a_point(x, y);x += tx;}
}//拖动鼠标
void drag_mouse(int x, int y)
{ex = x;ey = y;printf("待定坐标:起点(%d, %d) 终点(%d, %d)\n", bx, by, ex, ey);//把两个坐标打印出来bresenham(bx, by, ex, ey);glFlush();
}//监听鼠标位置,并且画点
void listen_mouse(int button, int state, int x, int y)
{//抬起鼠标的时候是最终的 终点if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {ex = x;ey = y;printf("最终坐标:起点(%d, %d) 终点(%d, %d)\n", bx, by, ex, ey);//把两个坐标打印出来bresenham(bx, by, ex, ey);//画线glFlush();}//点击鼠标的时候 是起点if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){bx = x;by = y;}
}void display()
{bresenham(bx, by, ex, ey);
}int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(window_width, window_height);glutCreateWindow("Bresenham算法画直线");glClearColor(1, 1, 1, 1);//设置绘制窗口颜色为白色//glClear(GL_COLOR_BUFFER_BIT);//清除窗口内容glMatrixMode(GL_PROJECTION);/*设置为投影类型模式和其他观察参数*/glLoadIdentity();/*设置为投影类型模式和其他观察参数*/gluOrtho2D(0, window_width, window_height, 0);/*设置为投影类型模式和其他观察参数,观察窗口的大小要与画布大小一致,所以直接设置全局变量即可*/glPointSize(3.0f);//设置点的大小glColor3f(10, -10, -10);//设置点的颜色glutDisplayFunc(&display);glutMouseFunc(listen_mouse);glutMotionFunc(drag_mouse);glutMainLoop();return 0;
}
计算机图形学E2——OpenGL Bresenham算法画直线相关推荐
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- Bresenham算法画直线
本博客仅限于斜率在0~1之间的直线 原算法 设直线起始点坐标为(xs,ys),均为整数,即 x1 = xs, y1 = ys e(x2) = y2 - y1 - 0.5 = m - 0.5 终点坐标为 ...
- 计算机图形学E7——OpenGL 交互式三角形裁剪直线
其他计算机图形学实验见 链接 #include<gl/glut.h> #include<iostream> #include<algorithm> #include ...
- Bresenham 算法画直线
参考:Bresenham 画线算法推导过程_在到处之间找我-CSDN博客_bresenham画线算法今天复习这个算法的时候,有一点没有立马反应过来,故特此记此篇博客作为备忘.文章目录描点原理用 $p_ ...
- 计算机图形学 OpenGl-种子填充算法画红黄绿交通灯
一.实验原理 我就不多叙述了,课本上说的已经够多了,其次我自己也是借鉴别人的代码写出来的 二.上机环境 VS2010 三.代码运行效果 四.完整代码 #include <GL/glut.h> ...
- 计算机图形学04:中点Bresenham算法画椭圆
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 平移计算机图形学代码注释,求代码注释:计算机图形学的OpenGL画四面体。高手来吧。争取每句都注释下。谢谢...
求代码注释:计算机图形学的OpenGL画四面体.高手来吧.争取每句都注释下.谢谢 答案:3 信息版本:手机版 解决时间 2018-12-20 05:00 已解决 2018-12-20 01:58 求 ...
- 使用openGL,用Bresenham算法画椭圆
运行结果 源代码 //用Bresenham算法画椭圆 #include<iostream> #include<stdlib.h> #include <GL/glut.h& ...
最新文章
- Elide 4.3.1 发布,雅虎开源的应用数据 API 搭建平台
- 孙庆新:做产品,感觉从何而来
- Stanford UFLDL教程 稀疏自编码器符号一览表
- Java EE + MongoDb与Apache TomEE和Jongo Starter项目
- 【Elasticsearch】用ElasticSearch实现基于标签的兴趣推荐
- 今晚博文视点大咖直播伴你读No.2:人工智能学习路线
- python3中文乱码解决方法
- Tomcat详解(五)——jforum论坛部署实战
- oracle数据库sqlloader,Oracle 的SQL*LOADER
- 鸿蒙系统清理垃圾,极速清理系统垃圾 一举收回上G磁盘空间
- 齐齐哈尔计算机科学与技术学院,齐齐哈尔职工大学官网
- 在Jmeter中添加的JSR223 Sampler后,目前网上资源只有python2.7的jar包,是否有哪位仁兄,有支持python3的jar包,请支持一次。
- 初识C语言,一起迈入编程世界的大门
- 关于笔记本电池显示未充电的
- C# Connection:连接数据库
- Delphi实现shell扩展
- WPF TabControl 数据绑定
- iOS QQ第三方登录
- html avatar属性,动画混合问题,Avatar动画混合报错.
- 帝国cms(empirecms)常用代码
热门文章
- 设置TDSAuthenticationManager属性对DataSnap服务端的接口授权
- Sdut 2165 Crack Mathmen(数论)(山东省ACM第二届省赛E 题)
- mysql 命令导出excel
- oracle12c报ora28000,ORA-28000: the account is locked用户锁定问题排查解决
- CCF201509-2 日期计算
- C语言课后习题(44)
- PAT乙级(1009 说反话)
- flash动画制作成品_「咻动画」flash动画在制作方面有哪些优势?
- 国产数据库发展十策(二):数据库难在研发还是难在生态?
- 嘉年华回顾丨胡连亚带你见证金融行业从标准和平台层面推进数据库能力迭代...