DDA算法画直线+源代码
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算法画直线+源代码相关推荐
- DDA算法画直线----计算机图形学
生成直线的DDA算法: 假设待扫描转换的直线段为 Pb(xb, yb), Pe(xe, ye),如图所示: 令 , 斜率 , 则直线方程为 为方便起见,这里 假定 . 显然,对于每一个 xi ...
- dda算法画直线_深度学习算法第一讲感知机数学原理解析及实现
前言 从本篇开始我们将讲解一些机器学习中常用的算法模型及实现原理,本系列会一直更新,把自己走过的弯路都记录下来,也希望后人学习的过程能更顺畅一点. 正文 感知机的理解 感知机属于机器学习算法中 ...
- 布兰森汉姆画圆matlab,bresenham算法画直线
实验一名称:基本图形的生成算法 要求:(1)掌握 DDA 生成线段算法 (2)掌握 Bresenham 生成线段算法 (3)掌握生成圆弧算法 1. 代码 (1) Bresenham 画线算法 v 实验 ...
- 【计算机图形学】基于OpenGL的中点Bresenham算法画直线
学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...
- 计算机图形学E2——OpenGL Bresenham算法画直线
其他计算机图形学实验见 链接 要求 使用Bresemham算法画直线,并且通过鼠标可以实现交互操作 参考代码: 代码1 代码2 代码3(代码好理解) 代码4(讲解很全面) #include<io ...
- 计算机图形学实习教程之基本图形的生成(直线DDA算法,直线中点算法,Bresenham画圆算法),利用C#实现,附源码
环境:Win10+Visual Studio 2022 Community 在本次实验中需要用到上一篇文章实验内容的代码及环境,详情请见:传送门 目录 一.实验目的 二.实验过程 1.生成直线的DDA ...
- 基于Bresenham和DDA算法画线段
直线:y=kx+b 为了将他在显示屏上显示出来,我们需要为相应的点赋值,那么考虑到计算机的乘法执行效率,我们肯定不会选择用Y=kx+b这个表达式求值,然后进行画线段. 我们应当是将它转化为加法运算. ...
- Bresenham’s algorithm( 布兰森汉姆算法)画直线
简介 1967年,IBM的J.Bresenham提出了Bresenham算法. Bresenham算法是在一些约定条件下的最佳逼近. Bresenham算法通过前一个像素点提供的信息来 ...
- 利用DDA算法得到直线上的像素点坐标
图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标? 这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是 ...
- Bresenham改进算法结合wu反走样算法画直线
自己打造了CLine画直线类 1.CP2类 定义了点类 class CP2 { public:CRGB clr;double y;double x;CP2();CP2(double,double,CR ...
最新文章
- 十大机器智能新型芯片:华为抢占一席,Google占比最多
- getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)
- tableView 使用 reloadSections:withRowAnimation: 时,会跳动的问题
- 基于matlab/simulink的PMSM直接转矩控制和bangbang控制
- HDU - 1043 Eight(bfs打表)
- 腾讯位置服务地图选点这个怎么在小程序里面更新呀?
- mongodb 系列 ~ mongo 用户验证系列
- CMSampleBufferRef获取h264 char*数据及sps/pps
- 教你一招解决Git时提交到多个远程仓库
- php四则运算器,php实现简单四则运算器
- 按键精灵随机输入数字脚本,防重复脚本
- linux 块设备 dm,[CentOS7]dm块设备删除
- 戒指戴在不同手指上的含义
- Tableau豆瓣电影数据项目实战练习1
- Unity 分辨率框Config Dialog Banner尺寸要求
- DolphinDB Database丨交易回测系列一:技术信号回测
- 小程序动态隐藏分享按钮
- 基于Go语言Revel+Layui的OA办公系统
- Flutter dart 某一天、某一周、某一月、某一年的时间戳和时间
- 深入探索正交投影变换