DDA直线插补算法

  数值微分法即DDA法(Digital Differential Analyzer),是一种基于直线的微分方程来生成直线的方法。

直线DDA算法描述

  设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得:
dy/dx=(y2−y1)/(x2−x1)=△y/△x=m=直线斜率dy/dx=(y2-y1)/(x2-x1)=△y/△x=m=直线斜率dy/dx=(y2−y1)/(x2−x1)=△y/△x=m=直线斜率
可通过计算由x方向的增量△x引起y的改变来生成直线:
xi+1=xi+△xx_{i+1}=x_i+△xxi+1​=xi​+△x
yi+1=yi+△y=yi+△x⋅my_{i+1}=y_i+△y=y_i+△x·myi+1​=yi​+△y=yi​+△x⋅m
也可通过计算由y方向的增量△y引起x的改变来生成直线:
yi+1=yi+△yy_{i+1}=y_i+△yyi+1​=yi​+△y
xi+1=xi+△x=xi+△y/mx_{i+1}=x_i+△x=x_i+△y/mxi+1​=xi​+△x=xi​+△y/m

直线DDA算法思想

  选定x2-x1x2-x1x2-x1和y2-y1y2-y1y2-y1中较大者作为步进方向(假设x2-x1x2-x1x2-x1较大),取该方向上的增量为一个象素单位(△x=1),然后利用式(2-1)计算另一个方向的增量(△y=△x⋅m=m)(△y=△x·m=m)(△y=△x⋅m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(xi+1,yi+1)(x_{i+1},y_{i+1})(xi+1​,yi+1​)经取整后送到显示器输出,则得到扫描转换后的直线。

  之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。

  另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。

直线DDA算法实现:

1、已知直线的两端点坐标:(x1,y1)(x1,y1)(x1,y1),(x2,y2)(x2,y2)(x2,y2)
2、已知画线的颜色:color
3、计算两个方向的变化量:dx=x2-x1dx=x2-x1dx=x2-x1
             dy=y2-y1dy=y2-y1dy=y2-y1
4、求出两个方向最大变化量的绝对值:
               steps=max(∣dx∣,∣dy∣)steps=max(|dx|,|dy|)steps=max(∣dx∣,∣dy∣)
5、计算两个方向的增量(考虑了生成方向):
              xin=dx/stepsxin=dx/stepsxin=dx/steps
              yin=dy/stepsyin=dy/stepsyin=dy/steps
6、设置初始象素坐标:x=x1,y=y1x=x1,y=y1x=x1,y=y1
7、用循环实现直线的绘制

简单的DDA方法画直线时,可以采用二寄存器和一个加法器来实现

如图所示

用两个寄存器分别存放y(或x)的整数部分和小数部分。将非计长方向小于单位步长的增量yinc(或xinc)反复加到小数部分上,一直到其中小数部分溢出为止。再将溢出部分加到整数部分上,这时取y(或x)的整数部分作为新的坐标值。要得到最接近理想直线的点,应当进行四舍五入。四舍五入等价于加0.5后再舍位,所以寄存器的小数部分的初值为0.5。

matlab代码

%NAME     : CHANDAN KUMAR
%ROLL NO  : 05ME3004
%COURSE   : COMPUTER GRAPHICS AND SOLID MODELLING
%SUBJECT  : DIGITAL DIFFERENTIAL LINE DRAWING ALGORITHM
function draw(x0,y0,x1,y1)
clc
clear
point = input('Give coord[ x0 y0 x1 y1]: ');
x0 = point(1);y0 = point(2); x1 = point(3);y1=point(4);
dx = abs(x1-x0);
dy = abs(y1-y0);
sx = sign(x1-x0);
sy = sign(y1-y0);
if (dy > dx)step = dy;
else step = dx;
end
x(1) = x0; y(1) = y0; j = 1;
for i= 0:1:stepif (x1 == x)&(y1 == y)break;endj = j+1;x(j) = x(j-1) + (dx/step)*sx;y(j) = y(j-1) + (dy/step)*sy;
end
plot(round(x),round(y),'rs');
grid on ,hold onplot(x,y,'b^');
axis([point(1)-2 point(3)+2 point(2)-2 point(4)+2]);
%legend('DDA Points','Actual points',2);
title('Digital Differential Line Drawing Algorithm')

图中方形为DDA算法生成点的路径,三角形为实际路径

DDA直线插补算法原理与实现(matlab)相关推荐

  1. DDA插补算法C语言,DDA直线插补算法在单片机上的实现基于C.doc

    DDA直线插补算法在单片机上的实现基于C /*-------------------------------*/ /*时间2011年11月*/ /*功能:DDA 插补算法在单片机上实现*/ /*作者J ...

  2. c语言直线插补原理程序,直线插补算法

    直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走. 即机床数控系统依照一定方法确定刀具运动轨迹的过程.也可以说,已知曲线上的某些数据, ...

  3. matlab程序 直线插补,无聊写matlab仿真直线插补算法

    本帖最后由 CK345 于 2016-6-24 17:16 编辑 X0 = input('请输入起点横坐标 X\n X0 = '); Y0 = input('请输入起点纵坐标 Y\n Y0 = '); ...

  4. 基于带约束S型加减速曲线的空间直线插补与空间圆弧插补算法(Matlab)

    写在前面 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 在前面的博文中: 基于抛物线过渡(梯形加减速)的空间直线插补算法与空间圆弧插补算法(Matlab) 基于 ...

  5. 笛卡尔空间直线轨迹规划——S型曲线加减速插补算法(含MATLAB仿真验证代码)

    写这个算法,是因为博主正在做一个机械臂和全向小车的项目,里面涉及需要笛卡尔空间做直线轨迹的规划.通常的算法有梯型加减速,这个算法只是速度连续,加速度并不连续.所以实际冲击较大,无法实现柔性控制.况且网 ...

  6. 开源项目推荐:运动控制速度前瞻算法(Look-Ahead),连续小线段高速插补算法

    一.什么是速度前瞻 Look-Ahead 技术又称为速度前瞻控制技术,目前实现此技术有两个基本思路: 1.进行路径段之间速度衔接: 2.进行大量微小线段参数曲线拟合. Look-Ahead 技术考虑的 ...

  7. 用C语言代码实现布雷森汉姆直线插补

    布雷森汉姆直线插补是计算机图形学中常见的直线插补算法.以下是用C语言实现布雷森汉姆直线插补的代码示例: #include <stdio.h> #include <math.h> ...

  8. dda算法控制电机_插补计算原理与速度控制.DOC

    插补计算原理与速度控制 第三章 插补计算原理.刀具半径补偿与速度控制 第一节 概述 一.插补的基本概念 如何控制刀具或工件的运动是机床数字控制的核心问题.要走出平面曲线运动轨迹需要两个运动坐标的协调运 ...

  9. grbl控制3轴机械臂 原理 实现 (三) 之如何通过步进电机控制机械臂、插补算法

    参考: 图形学入门 https://www.zhihu.com/question/20330720 https://zhuanlan.zhihu.com/p/30553006 https://www. ...

最新文章

  1. SpringMVC入门学习---拦截器
  2. CMSIS对异常和中断标识符、中断处理函数名以及中断向量异常号都有严格的要求。
  3. 现代制造工程-考试复习02
  4. 虚拟现实大潮渐近:Oculus VR、EA和Avegant等多家公司...
  5. Centos出现-bash: unzip: command not found的解决办法
  6. UIImage 图片处理:截图,缩放,设定大小,存储
  7. [代码]Delphi实现双击左CTRL键调用记事本
  8. 【重磅预告】揭秘阿里双11技术进步历程!
  9. [转载]使用Java将Word转为Html或txt!
  10. python把utf8编码转为gbk_Python:UTF-8编码转换成GBK编码
  11. 单项选择题标准化考试系统设计c语言报告,C语言课程设计(单项选择题标准化考试系统)报告...
  12. 翻译: 中国北斗卫星导航系统 全球导航卫星系统 (GNSS)
  13. 人大金仓V8数据库安装教程及避坑小指南
  14. IPwe区块链智能池利用AI来处理专利分析
  15. 启动服务器应用程序失败,打开系统管理时提示:autoupdateserviceset.exe 应用程序错误 应用程序无法正常启动,请单击确定 关闭应用程序。...
  16. 软件工程面向对象分析
  17. 获取系统当前时间----sqlServer
  18. drbd+keepalived nfs高可用方案实践
  19. 三种编码器技术详解:各有利弊,如何选择?
  20. case when 的用法详解

热门文章

  1. [简历] PHP 技能关键字列表
  2. 华为云计算入门-计算虚拟化
  3. 力扣题——2.除数与被除数
  4. 【SSH】Hibernate学习(三)一对多、多对一、多对多
  5. Eclipse Eclipseme wtk配置JAVA ME开发环境
  6. Seq2Seq+Attention生成式文本摘要
  7. python3 下载 并 保存 pdf
  8. 下一代广播电视音频解决方案:MPEG-H
  9. 海思HI3518E视频处理基础概念《三》----- 视频处理子系统VPSS
  10. idea2018永久破解