DDA算法画直线+源代码

DDA算法画直线+源代码

文章目录

  • DDA算法画直线+源代码
  • 一、DDA算法
  • 二、斜率为0时的直线扫描
    • 1.垂直直线
    • 2.水平直线
  • 三、斜率小于1时的直线扫描
  • 四、斜率大于1的直线扫描
  • 总结

一、DDA算法

算法原理: 已知过端点(x0,y0),(x1,y1)的直线段L:y=kx+b,直线斜率为 k=y1-y0/x1-x0 从x的左端点开始,向x右端点步进,步长=1(个象素), yi+1 = yi+k 。
即:当x每递增1,y递增k(即直线斜率) 。

二、斜率为0时的直线扫描

1.垂直直线

代码如下(示例):

DDA(CDC *pDC, CPoint p1, CPoint p2,COLORREF color){CPoint start = p1, end=p2;if(start.x == end.x) {if(start.y > end.y){start = p2;end = p1;}while(start.y <= end.y){pDC->SetPixelV(start,color);start.y++;}}
}

2.水平直线

代码如下(示例):

DDA(CDC *pDC, CPoint p1, CPoint p2,COLORREF color){CPoint start = p1, end=p2;if(start.y == end.y) {if(start.x > end.x){start = p2;end = p1;}while(start.x <= end.x){pDC->SetPixelV(start,color);start.x++;}}
}


三、斜率小于1时的直线扫描

斜率小于1时选择x轴为步进方向,由两个点中x小的那个点为起始点。此时当x每递增1,y递增k。
代码如下(示例):

DDA(CDC *pDC, CPoint p1, CPoint p2,COLORREF color){CPoint start = p1, end=p2;double k = (double)(end.y-start.y)/(end.x-start.x);if(k<1 && k>-1){if(start.x >end.x){start = p2;end = p1;}}double y = start.y;while(start.x <= end.x){pDC->SetPixelV(start,color);start.x++;y += k;start.y = y+0.5;}return;}

四、斜率大于1的直线扫描

斜率大于1时选择y轴为步进方向,由两个点中y小的那个点为起始点。此时当y每递增1,x递增1/k。
代码如下(示例):

DDA(CDC *pDC, CPoint p1, CPoint p2,COLORREF color){CPoint start = p1, end=p2;double k = (double)(end.y-start.y)/(end.x-start.x);if(k>1) {if (start.y > end.y) {start = p2;end = p1;}double x = start.x;while (start.y <= end.y) {pDC->SetPixelV(start, color);start.y++;x += 1 / k;start.x = x + 0.5;}}

总结

一些操作的注意事项:
由于使用了函数,所以需要先在MFCApplication1View.h这个文件中的public添加函数名和函数参数:

然后下面贴全部的源代码:

void CMFCApplication1View::OnDraw(CDC* pDC)
{CMFCApplication1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CPoint A(200, 200), B(400, 100);DDA(pDC, A, B, RGB(255, 0, 0));// TODO: 在此处为本机数据添加绘制代码
}void CMFCApplication1View::DDA(CDC* pDC, CPoint p1, CPoint p2, COLORREF color) {CPoint start = p1, end = p2;if (start.x == end.x) {if (start.y > end.y) {start = p2;end = p1;}while (start.y <= end.y) {pDC->SetPixelV(start, color);start.y++;}}if (start.y == end.y) {if (start.x > end.x) {start = p2;end = p1;}while (start.x <= end.x) {pDC->SetPixelV(start, color);start.x++;}}double k = (double)(end.y - start.y) / (end.x - start.x);if (k<1 && k>-1) {if (start.x > end.x) {start = p2;end = p1;}double y = start.y;while (start.x <= end.x) {pDC->SetPixelV(start, color);start.x++;y += k;start.y = y + 0.5;}}else {if (start.y > end.y) {start = p2;end = p1;}double x = start.x;while (start.y <= end.y) {pDC->SetPixelV(start, color);start.y++;x += 1 / k;start.x = x + 0.5;}}return;}

DDA算法画直线+源代码相关推荐

  1. DDA算法画直线----计算机图形学

    生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令  , 斜率  , 则直线方程为  为方便起见,这里 假定  . 显然,对于每一个 xi  ...

  2. dda算法画直线_深度学习算法第一讲感知机数学原理解析及实现

    前言    从本篇开始我们将讲解一些机器学习中常用的算法模型及实现原理,本系列会一直更新,把自己走过的弯路都记录下来,也希望后人学习的过程能更顺畅一点. 正文 感知机的理解  感知机属于机器学习算法中 ...

  3. 布兰森汉姆画圆matlab,bresenham算法画直线

    实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...

  4. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  5. 计算机图形学E2——OpenGL Bresenham算法画直线

    其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...

  6. 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码

    环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...

  7. 基于Bresenham和DDA算法画线段

    直线:y=kx+b 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Y=kx+b这个表达式求值,然后进行画线段. 我们应当是将它转化为加法运算. ...

  8. Bresenham’s algorithm( 布兰森汉姆算法)画直线

    简介 1967年,IBM的J.Bresenham提出了Bresenham算法.     Bresenham算法是在一些约定条件下的最佳逼近.     Bresenham算法通过前一个像素点提供的信息来 ...

  9. 利用DDA算法得到直线上的像素点坐标

    图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标? 这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是 ...

  10. Bresenham改进算法结合wu反走样算法画直线

    自己打造了CLine画直线类 1.CP2类 定义了点类 class CP2 { public:CRGB clr;double y;double x;CP2();CP2(double,double,CR ...

最新文章

  1. 十大机器智能新型芯片:华为抢占一席,Google占比最多
  2. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
  3. tableView 使用 reloadSections:withRowAnimation: 时,会跳动的问题
  4. 基于matlab/simulink的PMSM直接转矩控制和bangbang控制
  5. HDU - 1043 Eight(bfs打表)
  6. 腾讯位置服务地图选点这个怎么在小程序里面更新呀?
  7. mongodb 系列 ~ mongo 用户验证系列
  8. CMSampleBufferRef获取h264 char*数据及sps/pps
  9. 教你一招解决Git时提交到多个远程仓库
  10. php四则运算器,php实现简单四则运算器
  11. 按键精灵随机输入数字脚本,防重复脚本
  12. linux 块设备 dm,[CentOS7]dm块设备删除
  13. 戒指戴在不同手指上的含义
  14. Tableau豆瓣电影数据项目实战练习1
  15. Unity 分辨率框Config Dialog Banner尺寸要求
  16. DolphinDB Database丨交易回测系列一:技术信号回测
  17. 小程序动态隐藏分享按钮
  18. 基于Go语言Revel+Layui的OA办公系统
  19. Flutter dart 某一天、某一周、某一月、某一年的时间戳和时间
  20. 深入探索正交投影变换

热门文章

  1. Ubuntu安装wine和Wine QQ
  2. Spring Boot设置指定包的日志级别
  3. abap-商业发票管理系统
  4. 网站监控工具有哪些4款免费国内在线网站监控工具
  5. ipq4029 高通 芯片 openwrt 资料收集
  6. python html5 便利店收银系统_便利店收银系统使用教程
  7. Fortran入门——菜鸟级基础语法
  8. 基恩士PLC实例笔记①--立项及编程
  9. 极限学习机(Extreme Learning Machine, ELM)原理详解和MATLAB实现
  10. MATLAB 2015B中文安装激活破解方法图文教程