DDA(digital differential analyzer)

由直线的斜截式方程引入

对于正斜率的线段,如果斜率<=1,则以单位x间隔(δx=1)取样,并逐个计算每一个y值

Yk+1 = Yk + m   (m为由初始点确定的斜率)

对于斜率>1的线段

Xk+1 = Xk + 1/m   (m为由初始点确定的斜率)

起始端点在于右侧时 ”+” -> ”-”

#include "stdlib.h"

#include "math.h"

inline int round(const float a){return int (a + 0.5);}

//实现算数取整

void lineDDA(int x0, int y0, int xEnd, int yEnd)

{

    int dx = xEnd - x0, dy = yEnd - y0, steps, k;

    float xIncrement, yIncrement, x = (float)x0, y = (float)y0;

    if(fabs(dx)>fabs(dy))

    {

         steps = fabs(dx);

    }

    else

    {

         steps = fabs(dy);

    }

    //比较斜率

    xIncrement = float(dx)/float(steps);

    yIncrement = float(dy)/float(steps);

    setpixel(round(x),round(y));

    for(k=;k<steps;k++)

    {

         x += xIncrement;

         y += yIncrement;

         setpixel(round(x),round(y));

    }

    //增量绘图

}

Bresenham 画线算法

Bresenham算法通过计算下一个理论点与其相邻栅格的距离构造了决策参数,而后利用决策参数进行递推绘点。

dlower = y - yk = m(xk+1)+b - yk

dupper = (yk+1) - y = yk + 1 – m(xk+1)-b

决策参数p = △x(dlower - dupper) = 2△y*xk - 2△x*yk + c

|m|<1时的Bresenham画线算法为:

  1. 输入线段的两个端点,并将左端点储存在(x0,y0)中
  2. 将(x0,y0)装入帧缓存,画出第一个点;
  3. 计算常量△x, △有,△2y和2△y-2△x,并得到决策参数的第一个值:

P0 = 2△y - △x

4.从k = 0开始,在沿线段路径的每个xk处,进行下列检测:

如果pk<0,下一个要绘制的点是(xk+1,yk),并且

pk+1 = pk+2△y

否则,下一个要绘制的点是(xk+1,yk+1),并且

pk+1 = pk+2△y-2△x

5.重复步骤4,△x-1次

#include<stdlib.h>
#include<math.h> /*|m|<1.0时候的bresenham算法*/ void lineBres(int x0, int y0, int xEnd, int yEnd)
{
int dx = fabs(xEnd - x0), dy = fabs(yEnd - y0);
int p = * dy - dx;
int twoDy = * dy, twoDyminusDx = * (dy - dx);
int x, y; /*根据斜率正负决定起始点和终结点*/
if (x0 > xEnd)
{
x = xEnd;
y = yEnd;
xEnd = x0;
}
else
{
x = x0;
y = y0;
}
setPixel(x, y); while (x < xEnd)
{
x++;
if (p < )
p += twoDy;
else
{
y++; p += twoDyMinusDx;
}
setPixel(x, y)
}
}

两种画线算法(DDA&Bersenham)的更多相关文章

  1. Bresenham画线算法

    [Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...

  2. cocos2d中两种移动的算法

    在对cocos2d的sprite处理移动的过程中,通常用到的两种移动的算法: 假设这个CCNode是直接放在CCLayer上的 距离差法: CGPoint curTouchPosUI = [touch ...

  3. 计算机图形学(二)输出图元_3_画线算法_2_DDA算法

    DDA算法        数字微分分析仪(digital differential analyzer, DDA)方法是一种线段扫描转换算法.基于使用等式(3.4)或等式(3.5)计算的&x或& ...

  4. 中点Brehensam画线算法

    #include<stdio.h> #include<stdlib.h> #include"graphics.h" //函数声明 void MidBreha ...

  5. Bezier画线算法

    编译器:VS2013 描述:Bezier画线是利用导数相同拼接曲线,使曲线十分光滑,而不是随意拼接观赏性很差 主函数段 #include "stdafx.h" #include&l ...

  6. DDA画线算法

    #include<stdio.h> #include"graphics.h" #include<math.h> #include<stdlib.h&g ...

  7. matplotlib两种画散点图的方式

    对于matplotlib.pyplot( as plt ) 先输入主体数据部分: import numpy as np import matplotlib.pyplot as plt X_train ...

  8. PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家

    首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...

  9. 两种缓存淘汰算法LFU&LRU

    LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...

随机推荐

  1. Apache HttpServer Installing the apache2.2 service <OS 5>拒绝访问. :Failed to open the WinNT service manager

    Installing the apache2.2 service<OS 5>拒绝访问.  :Failed to open the WinNT service manager 只需要于管理员 ...

  2. Caliburn Micro框架

    Caliburn Micro框架快速上手(WP)   一.使用nuget添加起始工程 二.修改App.xaml文件和App.xaml.cs文件 AppBootstrapper介绍: AppBootst ...

  3. c#一个简单的实例告诉你,多继承还可以这么来

    我想多继承,要怎么搞???我想你一定会说“接口”,那么你有没有遇到这样的问题,你需要在一个类中继承另外2个类的所有方法,你要怎么做呢???难道要Coyp实现代码?No,往下看... 定义一个空接口比如 ...

  4. Twitter算法

    算法实践——Twitter算法面试题(积水问题)的线性时间解法   问题描述:在下图里我们有不同高度的挡板.这个图片由一个整数数组所代表,数组中每个数是墙的高度.下图可以表示为数组(2.5.1.2.3 ...

  5. 设计模式18---设计模式之策略模式(Strategy)(行为型)

    1.场景模拟 简单的报价管理系统: 对于普通用户和新用户报全价 对于老客户统一折扣5% 对于大客户统一折扣10% 2.不用模式的解决方案 package demo16.strategy.example ...

  6. Stream使用教程

    现在,计算机CPU运行速度的快速发展已经远远超过了内存的访问速度.越来越多的程序性能被内存带宽所限制,而不是计算机的CPU运行速率. Stream benchmark是一个简单的合成基准测试程序,衡量 ...

  7. Linux环境进程间通信(三):消息队列

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  8. 无穷字符串问题--CSDN上的面试题(原创)

    网上看到一道奇怪的题,分享一下:http://hero.csdn.net/Question/Details?ID=307&ExamID=302 发布公司:CSDN 有 效 期:2014-02- ...

  9. ios学习之路四(新建Sprite Kit 项目的时候出现apple LLVM 5.0 error)

    在新建sprite kit 项目的时候出现"apple LLVM 5.0 error" 解决方法 在网上搜索,stackoverflow 上是这么说的点击打开链接.按照他的我也没解 ...

  10. AOP编程和ASP.NET MVC

    AOP编程和ASP.NET MVC AOP(Aspect oriented programming)面向切面编程.说成切面不容易理解,代码哪里有切面?又不是三维物体.概念不管,我们从其思想来理解这个名 ...