目录

1. 说明

2. 实现

3. 完整测试代码


1. 说明

具体的bresenham算法可以参考https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html,这里介绍的是一种基于该算法的实现方式。为什么说是最简洁的实现的看下面的代码实现就知道了,短短不到三十行代码便可以实现全坐标系任意斜率直线的绘制。

这里采用了虚拟轴的概念,因而使得可以屏蔽斜率的概念可以使得所有的直线绘制都转化为第一象限斜率小于1情况下的直线绘制。因此所有的判定条件只有一个e+dy-0.5dx

2. 实现

std::vector<Point> bresenham(Point start_point, Point end_point) {std::vector <Point> res;Point pos = start_point;int direction_x = end_point.x - start_point.x;int direction_y = end_point.y - start_point.y;int delta_x = fabs(direction_x);int delta_y = fabs(direction_y);int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);int decision_param_x = - (max_xy / 2);int decision_param_y = decision_param_x;res.push_back(start_point);for(int i = 0; i < max_xy; ++i) {//处理xdecision_param_x += delta_x;if(decision_param_x > 0) {direction_x > 0 ? pos.x++ : pos.x--;decision_param_x -= max_xy;}//处理ydecision_param_y += delta_y;if(decision_param_y > 0) {direction_y > 0 ? pos.y++ : pos.y--;decision_param_y -= max_xy;}res.push_back(pos);}return res;
}

以上便是该算法实现的全部内容,可以很容易移植到不同的测试环境中测试。下图是在windows平台终端下的测试结果。

3. 完整测试代码

以下为完整的测试代码:

#include <iostream>
#include <windows.h>
#include <vector>
#include <cmath>typedef struct
{int x;int y;
}Point;Point start_point = {15, 15};
Point end_point = {8, 0};std::vector<Point> bresenham(Point start_point, Point end_point) {std::vector <Point> res;Point pos = start_point;int direction_x = end_point.x - start_point.x;int direction_y = end_point.y - start_point.y;int delta_x = fabs(direction_x);int delta_y = fabs(direction_y);int max_xy = ((delta_x > delta_y) ? delta_x : delta_y);int decision_param_x = - (max_xy / 2);int decision_param_y = decision_param_x;res.push_back(start_point);for(int i = 0; i < max_xy; ++i) {//处理xdecision_param_x += delta_x;if(decision_param_x > 0) {direction_x > 0 ? pos.x++ : pos.x--;decision_param_x -= max_xy;}//处理ydecision_param_y += delta_y;if(decision_param_y > 0) {direction_y > 0 ? pos.y++ : pos.y--;decision_param_y -= max_xy;}res.push_back(pos);}return res;
}void gotoXY(int x, int y)
{COORD cd;    cd.X   =   x; cd.Y   =   y;     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd);
}int main(void)
{std::vector<Point> point_set = bresenham(start_point, end_point);system("cls");for(int i = 0; i < point_set.size(); ++i){gotoXY(point_set[i].x, point_set[i].y);std::cout << "*" ; }gotoXY(0,30);
}

计算机图形学_bresenham画线算法的最简洁实现(已验证)相关推荐

  1. bresenham画线算法的最简洁实现

    bresenham画线算法的最简洁实现 具体的bresenham算法可以参考https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.h ...

  2. java实现计算机图形学中点画线算法

    代码:DrawLine.java: import javax.swing.*; import java.awt.*;public class DrawLine extends JPanel {publ ...

  3. 计算机图形学学习笔记(4.1)画线算法

    前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...

  4. 图形学画直线c语言,002计算机图形学之直线画线算法

    002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: y = kx +b 在显示器上显示直线的话,如果使用如上的方程,每描一个点 需要进行一次浮点乘法,一次浮点加法,和取整操作. ...

  5. 计算机图形学--方法篇(DDA画线算法)

    计算机图形学中所有的绘制算法都是用离散的点尽可能的去逼近理想的图形,本篇为大家介绍常见的几种画线算法. 首先啰嗦一下大家都懂得直线方程,假设有直线: x的增量,y的增量有这样的关系:    或 ​​​ ...

  6. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

  7. 图形学--(中点画线法+Bresenham画线算法)

    编程环境:codeblocks+EGE库 用到的函数:putpixel(int x1,int y1,int color)  用某种颜色打亮一个坐标点. 这俩种算法都是用来在计算机上画一条直线的,那么我 ...

  8. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

  9. 【OpenGL】画线算法

    文章目录 DDA数值微分线段算法 中点画线法(简) Bresenham画线算法 DDA数值微分线段算法 数值微分法即DDA法(Digital Differential Analyzer),是一种基于微 ...

  10. Bresenham画线算法笔记

    目录 一.DDA算法和中点画线算法的回顾 二.Bresenham画线算法 一.DDA算法和中点画线算法的回顾 1.DDA算法(Digtal Differential Analyzer) 假设两个端点坐 ...

最新文章

  1. 2020-08-20 CountVectorizer 包含示例 API
  2. 关于javascript数据存储机制的一个案例。
  3. eeglab中文教程系列(14)-Working with ICA Components
  4. yum 仓库 本地和在线
  5. Transformer用到3D点云分割
  6. spring中的设计模式_面试官:来给我说一下 Spring 中使用了哪些设计模式?
  7. 【HDU - 5777】domino(贪心)
  8. 如何实现响应式布局?
  9. 使用 MonoGame* 开发游戏
  10. Ubuntu16.04.2中安装minidwep
  11. 双指缩放canvas图片_JS实现移动端双指缩放和旋转方法
  12. 吃饭 睡觉 打豆豆游戏
  13. android窗口变化事件,android ViewPager滑动事件讲解
  14. dns劫持解决办法、dns劫持是什么、dns劫持原理
  15. 上海公积金销户问题--程序员
  16. python接入支付宝
  17. 波段合成,去除黑边并提取土地利用数据....下
  18. malloc申请堆内存
  19. html语音输入功能讯飞,win10系统利用讯飞语音输入法实现电脑语音输入的方案介绍...
  20. 中国土地市场网爬虫案例

热门文章

  1. php中通过post和get传递数组的方法
  2. Spring中利用配置文件和 value注入属性值
  3. 【论文解读】[目标检测]retinanet
  4. NE555脉冲模块电路
  5. GoldenGate 12.3 MA架构介绍系列(4)–Restful API介绍
  6. ESLint 规则详解(二)
  7. 在Array原型链上扩展remove,contain等方法所遇到的坑
  8. 扫描软件(to be followed)
  9. [原创] 测试策略是什么?
  10. gem install XXX报错