直线段的矢栅转换算法(DDA算法、中心画线算法、Bresenham算法)

以下为drawLine.cpp,分别对相应的原理进行了注释,只需调用相应的函数即可实现。

#include "drawLine.h"
#include "setPixel.h"
#include "cmath"void DDALine(int x0, int y0, int x1, int y1)  {      //DDA算法实现画直线float x=x0,y=y0;float dx=x1-x0;float dy=y1-y0;float xadd,yadd;      //定义x,y方向增量int step;      //定义总的步数if(abs(dx)>abs(dy)){  //dx绝对值大于dy,则表明线斜率在1a,2a,3a,4a区域,此时x增加1或-1,y增加k或-k.step=abs(dx);      //此时步数为x方向长度float yadd=(float)dy/(float)step;float xadd=(x1 - x0) > 0 ? 1 : -1;   //分别用dx,dy除步数得到x,y方向增量值for(int i=0;i<=step;i++){     //利用总步数建立循环setPixel(x,int(y+0.5));    //填充点y=y+yadd;    x=x+xadd;    //x,y方向分别进行增加相应的分量}}else{   //dy绝对值大于dx,斜率在1b,2b,3b,4b区间,此时交换x,y,并将步数用|dy|代替.step=abs(dy);yadd=(y1 - y0) > 0 ? 1 : -1;xadd=(float)dx/(float)step;for(int i=0;i<=step;++i){setPixel(int(x+0.5),int(y));y=y+yadd;x=x+xadd;}}
}void swap_value(int &a,int &b){      //交换两个参数数值的函数int temp=a;     //temp为中间参数a=b;b=temp;
}void midpoint_line(int x0,int y0,int x1,int y1){int a, b, d2, x, y, flag = 0;if (abs(x1 - x0) < abs(y1 - y0))   //如果|k|>1,则将两个点进行交换,并让flag为1.{swap_value(x0,y0);swap_value(x1,y1);    flag = 1;   //判断|k|值与1的关系,0到1时为0,>1时为1.}if (x0 > x1) {     //保证x0<x1,则可以把画3,4区域线合并到1,2区域中。swap_value(x0, x1);swap_value(y0, y1);}a = y0 - y1;b = x1 - x0;d2 = 2*a + b;    //摆脱小数点,提高效率,d0=2a+bif (y0 < y1) {     //k>0时,即画1a和3a区域,同时画出交换x,y过后在1a,3a区域的1b,3b区域.x = x0; y = y0;setPixel(x,y);    //绘制点,先绘制x0,y0.while (x < x1)   //直到绘制到x1终点截至,利用while循环绘制.{if(d2 < 0)    //di小于0时,y增加,di增加2a+2b{x++;y++;d2 =d2+ 2*a + 2*b;}else {       //di大于0时,y不变,di增加2ax++;d2 =d2+ 2 * a;}if(flag)    //|k|>1,此时x,y已交换,绘制时需要交换x,y.setPixel(y, x);elsesetPixel(x, y);   //0=<|k|<1,此时直接绘制相应点.}
}else {    //k<0,此时绘制4a和2a区域,同时画出交换x,y过后在2a,4a区域的2b,4b区域.x = x1;y = y1;setPixel(x, y);while (x >x0){if (d2 < 0){x--;y++;d2 = d2-2 * a + 2 * b;}else {x--;d2 =d2- 2 * a;}if (flag)    //|k|>1,交换x,y,绘制setPixel(y, x);elsesetPixel(x, y);}}
}void Bresenham_line1(int x0,int y0,int x1,int y1){      //方法一,代码较长int dx = x1 - x0;   //x偏移量int dy = y1 - y0;   //y偏移量int ux = dx >0 ? 1 : -1;   //x伸展方向int uy = dy >0 ? 1 : -1;   //y伸展方向int dx2 = abs(dx << 1);    //x偏移量乘2int dy2 = abs(dy << 1);    //y偏移量乘2if (abs(dx)>abs(dy))       //以x为增量方向计算{int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换int x = x0;//起点x坐标int y = y0;//起点y坐标while (x!=x1+ux){setPixel(x,y);e = e + dy2;    //来自 2*e*dx= 2*e*dx + 2dy if (e > 0)      //e是整数且大于0时表示要取右上的点(否则是右下的点) {if (y!=y1){y += uy;}e = e - dx2;//2*e*dx = 2*e*dx - 2*dx}x += ux;}}else{//以y为增量方向计算int e = -dy; //e = -0.5 * 2 * dy,把e 用2 * dy* e替换int x = x0;//起点x坐标int y = y0;//起点y坐标while (y!=y1+uy){setPixel(x,y);e = e + dx2;//来自 2*e*dy= 2*e*dy + 2dyif (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点) {   if (x!=x1){x += ux;}e = e - dy2;//2*e*dy = 2*e*dy - 2*dy}y += uy;}}
}void Bresenham_line(int x0,int y0,int x1,int y1
){     //方法二,较简便setPixel(x0,y0);int dx, dy;int flag=0;dx = abs(x1-x0);dy = abs(y1-y0);if (dx == 0 && dy == 0)   //如果就x0,y0一个点,则绘制结束.return;if (dy > dx)  //如果|k|>1,则将x,y值进行交换,同时令flag=1,做好标记{flag = 1;swap_value(x0,y0);swap_value(x1,y1);swap_value(dx,dy);}int tx = (x1 - x0) > 0 ? 1 : -1;   //判断位置关系确定步长正负int ty = (y1 - y0) > 0 ? 1 : -1;int curx = x0 + 1;int cury = y0;      //将第一个点作为初值赋予curx,cury变量int dS = 2 * dy;int dT = 2 * (dy-dx);int d =dS-dx;while (curx != x1)    //利用x进行循环{if (d >= 0) {     //根据d进行区分d += dT;cury += ty;}else{d += dS;}if (flag)       //flag为1时,x,y需要进行交换.setPixel(cury,curx);elsesetPixel(curx, cury);curx+=tx;}
}void draw_line(int x0, int y0, int x1, int y1)
{     //需要时调用相应的方法DDALine(x0,y0,x1,y1);//midpoint_line(x0,y0,x1,y1);//Bresenham_line(x0,y0,x1,y1);//Bresenham_line1(x0,y0,x1,y1);  //舍弃
}

直线段的矢栅转换算法(DDA算法、中心画线算法、Bresenham算法)相关推荐

  1. [XJTUSE]计算机图形学第二章作业,使用OpenGL编程实现DDA、中点画线和Bresenham算法和中点画圆法

    首先是Windows10 + Visual Studio 2019 搭建OpenGL环境可以查看如下链接: 萌新向!!!Windows10 + Visual Studio 2019 搭建OpenGL环 ...

  2. 计算机图形学 学习笔记(一):概述,直线扫描转换算法:DDA,中点画线算法,Bresenham算法

    前言 本笔记基于 http://www.icourse163.org/learn/CAU-45006?tid=1001746004#/learn/announce 感谢中国农大 赵明老师的分享~ 现在 ...

  3. GIS杂记:气象数据处理心得(矢栅转换)

    目录 1. 批量处理数据 2. 栅格计算器(对两个图层进行属性筛选并求交) 3. 计算重叠要素 3.1 矢栅转换(非常容易忽略的步骤!!!) 3.2 计算重叠要素 3.3 在Arcgis中再进行分类 ...

  4. 在线新闻推荐网 Python+Django+Mysql开发技术 基于用户、物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法、机器学习、分布式大数据、人工智

    在线新闻推荐网 Python+Django+Mysql开发技术 基于用户.物品的协同过滤推荐算法 个性化新闻推荐系统 协同过滤推荐算法在新闻网站中的运用 个性化推荐算法.机器学习.分布式大数据.人工智 ...

  5. 计算机图形学:直线段的生成算法,VS实现数值微分法和中点Bresenham算法

    实验要求: 实现直线段生成的两种方法: 1) 数值微分法 和 2) 中点Bresenham算法.用户用鼠标点击两个点,两个点都确定后,利用直线段的绘制算法绘制两个点之间的一条直线段.本文章仅涉及算法的 ...

  6. 中点画线完整算法c语言,中点画线算法

    在网上看中点画线算法,很多说法是中点画线类似于Breshehanm画线. 但是助教说的中点画线是寻找直线两端点的中点进行画点,然后分别递归左右半段直线. 当年不好好学习,递归掌握的不好,现在自己试了试 ...

  7. 哈希分布与一致性哈希算法—在swift中看到这个有意思的算法

    在研究swift的基本原理时,看到了这个算法,不怎么明白,找了几个帖子来学习.感谢@博客园一条辉的博客(liunx.cnblogs.com) @sparkliang 前言 在我们的日常web应用开发当 ...

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

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

  9. 栅格地图中自由区域之Bresenham算法及个人搜索算法对比

    栅格地图中的区域可以分为三种Occupied被占用(有障碍), Free自由区域(无障碍), Unknown Space未知区域. 假设图1,中黄色代表机器人,显眼的绿色代表激光雷达,红色线代表一条激 ...

  10. 中点画线完整算法c语言,中点画线算法(任意斜率)

    基本原理 在画直线段的过程中,当前像素点为(xp ,yp ),下一个像素点有两种可选择点P1(xp +1,yp )或P2(xp +1,yp +1).若M=(xp +1,yp +0.5)为P1与P2之中 ...

最新文章

  1. python string模块安装_python String模块-阿里云开发者社区
  2. Python工具包-中文处理工具FoolNLTK
  3. [BZOJ2834]回家的路
  4. shell脚本中$* 和 $@ 区别
  5. 理解函数:对象(this,arguments),方法(apply(),call(),bind())。
  6. Maven搭建Spring+Struts2+Hibernate项目详解
  7. java中jdk api等概念的解释
  8. 从0开始学习WBE前端
  9. 机器人工程毕业设计☞开题报告
  10. python小工具集_Python 小工具集合
  11. 大数据可视化 课堂笔记-1
  12. CISCO路由器命令大全
  13. Lattice开发工具 diamond总结
  14. amd显卡多屏识别了 但是屏幕不亮_最近发布:针对AMD显卡多屏显示设置的完整解决方案。ppt28...
  15. 光驱启动以及联想笔记本电脑如何设置从光驱启动
  16. 基于Visual Studio 2003/2005的Office插件开发FAQ
  17. visio设置图片默认大小_学习PS第6课(图片大小设置)
  18. 编译原理—x86汇编指令
  19. Row size too large (> 8126). Changing some columns to TEXT or BLOB… | Mysql / MariaDB
  20. 最值得公司经理学习的创业七大原则--献给从“小公司”转为“大公司”的企业

热门文章

  1. JS 中样式显示(clientWidth和clientHeight、offsetLeft、scrollHeight )
  2. autojs- 联众识别
  3. 你的计算机无法启动一键还原,电脑一开机就进入dos之家的一键还原硬盘版,无法进入系统...
  4. 分享一个外泌体数据库
  5. linux 开机logo制作工具,linux开机logo制作
  6. 无线网radius服务器ip,怎么设置无线路由器的radius服务器ip地址
  7. 【ichart】简单的统计图表ichart.js的使用
  8. 通信原理包络是什么意思_自己总结的通信原理部分知识点
  9. 为eclipse3.6安装subversive插件
  10. css制作序列帧动画