行业网站建设方案,西安建站平台,长沙 网站设计 公司价格,网站打不开怎么解决作者#xff1a;非妃是公主 专栏#xff1a;《计算机图形学》 博客地址#xff1a;https://blog.csdn.net/myf_666 个性签#xff1a;顺境不惰#xff0c;逆境不馁#xff0c;以心制境#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、问题提出二、… 作者非妃是公主 专栏《计算机图形学》 博客地址https://blog.csdn.net/myf_666 个性签顺境不惰逆境不馁以心制境万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、问题提出二、算法原理三、OpenGL代码实现代码效果展示the end…… 专栏推荐
专栏名称专栏地址软件工程专栏——软件工程计算机图形学 专栏——计算机图形学 操作系统专栏——操作系统软件测试专栏——软件测试机器学习专栏——机器学习数据库专栏——数据库算法专栏——算法
专栏系列文章
文章名称文章地址直线生成算法(DDA算法)计算机图形学01——DDA算法中点BH算法绘制直线计算机图形学02——中点BH算法改进的中点BH算法计算机图形学03——改进的中点BH算法中点Bresenham画椭圆计算机图形学04——中点BH绘制椭圆中点BH算法绘制任意斜率直线计算机图形学05——中点BH算法绘制任意斜率的直线中点Bresenham画圆计算机图形学06——中点BH算法画圆有效边表法的多边形扫描转换计算机图形学07——有效边表法绘制填充多边形中点BH算法绘制抛物线 100xy2100x y^2100xy2计算机图形学08——中点BH绘制抛物线二维观察之点的裁剪计算机图形学09——二维观察之点裁剪二维观察之线的裁剪计算机图形学10——二维观察之线裁剪二维观察之多边形的裁剪计算机图形学11——二维观察之多边形裁剪二维图形的几何变换计算机图形学12——二维图形几何变换三维图形的几何变换计算机图形学13——三维图形几何变换三维图形的投影变换计算机图形学14——三维图形投影变换
序
计算机图形学英语computer graphics缩写为CG是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科是计算机科学的一个分支领域主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形事实上同时包括了二维图形以及影像处理。 一、问题提出
前几篇文章中已经提到了中点BH算法绘制直线计算机图形学02中点BH算法绘制直线、计算机图形学03改进的中点BH算法。
但在这两篇文章种都只讨论了斜率大于 0 小于 1 的情况即0k10k10k1,如果要扩展到任意斜率怎么办呢
其实也很简单秩序要将斜率分成 4 类然后分情况讨论即可具体的算法原理及推导如下。 二、算法原理
将斜率分为4种情况分别为
0k10k10k1k1k1k1−1k0-1k0−1k0k−1k-1k−1
然后针对每种情况进行求解得到d、x和y的更新表达式如下 详细推导可见直线的中点Bresenham算法的实现 三、OpenGL代码实现代码
OpenGL实现如下
// 中点Bresenham算法绘制直线段(k任意)
void MidBhline2(int x0, int y0, int x1, int y1) {int dx, dy, d, UpIncre, DownIncre, x, y;if (x0 x1) { // x0为起始点x1为终止点x x1; x1 x0; x0 x; y y1; y1 y0; y0 y;}x x0; y y0; dx x1 - x0; dy y1 - y0; // 0 k 1if (dy 0 dy dx) {d dx - 2 * dy; // d的初始值UpIncre 2 * dx - 2 * dy; // 2dx*(1 k)DownIncre -2 * dy; // 2dx(-k)glBegin(GL_POINTS); // 开始绘制点while (x x1) {glVertex2i(x, y); // 画点x; // 更新xif (d 0) { // 根据d的符号更新d和yy;d UpIncre;}elsed DownIncre;}glEnd(); // 结束绘制点}// k 1else if (dy 0 dy dx) {d - dy 2 * dx; // d的初始值UpIncre 2 * dx; // 2dx*(1)DownIncre 2 * dx - 2 * dy;// 2dx*(1-k)glBegin(GL_POINTS); // 开始绘制点while (x x1) {glVertex2i(x, y); // 画点y; // 更新yif (d 0) { // 根据d的符号更新d和xd UpIncre;}else {x;d DownIncre;}}glEnd();}// -1 k 0else if (dy 0 dy -dx) {d -dx - 2 * dy; // d的初始值UpIncre -2 * dy; // 2dx*(1)DownIncre -2 * dx - 2 * dy;// 2dx*(1-k)glBegin(GL_POINTS); // 开始绘制点while (x x1) {glVertex2i(x, y); // 画点x; // 更新yif (d 0) { // 根据d的符号更新d和xd UpIncre;}else { y--;d DownIncre;}}glEnd();}// k -1else if (dy 0 dy -dx) {d -2 * dx - dy; // d的初始值UpIncre -2 * dx - 2 * dy; // 2dx*(1)DownIncre -2 * dx; // 2dx*(1-k)glBegin(GL_POINTS); // 开始绘制点while (x x1) {glVertex2i(x, y); // 画点y--; // 更新yif (d 0) { // 根据d的符号更新d和xx;d UpIncre;}else { d DownIncre;}}glEnd();}
}效果展示
运行该算法绘制直线后显示如下 the end……
中点BH算法对任意斜率的直线扫描转换方法到这里就要结束啦~~到此既是缘分欢迎您的点赞、评论、收藏关注我不迷路我们下期再见 我是Cherries一位计算机科班在校大学生写博客用来记录自己平时的所思所想 内容繁杂又才疏学浅难免存在错误欢迎各位大佬的批评指正 我们相互交流共同进步 注本文由非妃是公主发布于https://blog.csdn.net/myf_666转载请务必标明原文链接https://blog.csdn.net/myf_666/article/details/128173092