计算机图形学——生成直线的DDA算法

news/2024/7/8 5:37:36 标签: 图形, 算法

本博客计算机图形学系列文章索引:

地址:《计算机图形学系列相关文章索引(持续更新)》


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

  一、直线DDA算法描述:

  设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得

dy/dx
=(y2-y1)/(x2-x1)
=△y/△x
= m =直线的斜率(2-1)

  可通过计算由x方向的增量x引起y的改变来生成直线:

xi+1=xi+x(2-2)
yi+1=yi+y=yi+x·m(2-3)

  也可通过计算由y方向的增量y引起x的改变来生成直线:

yi+1=yi+y(2-4)
xi+1=xi+x=xi+y/m(2-5)

  式(2-2)至(2-5)是递推的。

  二、直线DDA算法思想:

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

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

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


  三、直线DDA算法实现:

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

                  putpixel(x,y,color);/*在(x,y)处,以color色画点*/
     x=x+xin;
     y=y+yin;
    }

  四、直线DDA算法演示:

      使用swf文件演示,演示文件放在我的网盘上了。

      地址为:http://www.kuaipan.com.cn/file/id_14024936532213950.htm

  五、直线DDA算法特点:

  该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。



http://www.niftyadmin.cn/n/1332046.html

相关文章

面试官问:前后端分离项目,有什么优缺点?我说:没

来源&#xff1a;blog.csdn.net/fuzhongmin05/article/details/815910721、背景前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;通过nginxtomcat的方式&#xff08;也可以中间加一个nodejs&#xff09;有效的进行解耦&#xff0c;并且前后端分离会为以后的大型分…

关于Wireshark The NPF driver isn’t running……解决办法

今天安装Wireshark软件时出现了如下图所示的错误&#xff0c;就搜索了一下解决方法&#xff0c;特总结如下&#xff1a; 这个错误是因为没有开启NPF服务造成的。简要说一下NPF吧。 NPF即网络数据包过滤器&#xff08;Netgroup Packet Filter&#xff0c;NPF&#xff09;是Winpc…

字节二面,让写一个LFU缓存策略算法,懵了

点击上方 果汁简历 &#xff0c;选择“置顶公众号” 优质文章&#xff0c;第一时间送达LRU全称 "Least Recently Used"&#xff0c;最近最少使用策略&#xff0c;判断最近被使用的时间&#xff0c;距离目前最远的数据优先被淘汰&#xff0c;作为一种根据访问时间来更…

为什么阿里不允许用Executors创建线程池,而是通过ThreadPoolExecutor的方式?

点击上方 果汁简历 &#xff0c;选择“置顶公众号”优质文章&#xff0c;第一时间送达作者&#xff1a;雪山上的蒲公英cnblogs.com/zjfjava/p/11227456.html1. 通过Executors创建线程池的弊端在创建线程池的时候&#xff0c;大部分人还是会选择使用Executors去创建。下面是创建…

让代码更美:10大编程字体

日复一日的编写代码&#xff0c;有没有感到审美疲劳&#xff1f;也许些许的改变就能让我们感到生活更美好。换一种编程字体吧&#xff01;体验一种新的代码感觉。 下面我眼中的十大编程字体&#xff1a; 10. Courier 基本上所有的系统都自带了此种字体&#xff0c;有时候它又以…

从零实现SpringBoot简易读写分离,也不难嘛!

点击上方“果汁简历”&#xff0c;选择“置顶公众号”最近在学习Spring boot&#xff0c;写了个读写分离。写完以后发现从零开始写读写分离并不难&#xff01;我最初的想法是&#xff1a;读方法走读库&#xff0c;写方法走写库&#xff08;一般是主库&#xff09;&#xff0c;保…

MyBatis 批量插入的 3 种方式!还有谁不会?

点击上方“果汁简历”&#xff0c;选择“置顶公众号”数据库使用的是sqlserver&#xff0c;JDK版本1.8&#xff0c;运行在SpringBoot环境下&#xff0c;对比3种可用的方式&#xff1a;反复执行单条插入语句xml拼接sql批处理执行先说结论&#xff1a;少量插入请使用反复插入单条…

在项目中用了Arrays.asList、ArrayList的subList,被公开批评

点击上方“果汁简历”&#xff0c;选择“置顶公众号”1. 使用Arrays.asList的注意事项1.1 可能会踩的坑先来看下Arrays.asList的使用&#xff1a;List<Integer> statusList Arrays.asList(1, 2); System.out.println(statusList); System.out.println(statusList.contai…