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. Asp.net MVC集成Google Calendar API(附Demo源码)

    Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...

  2. 不是技术牛人,如何拿到国内IT巨头的Offer【转】

    转:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人 ...

  3. 自由的Debian

    原文:http://www.debian.org/intro/free 许多人在刚开始接触自由软件时都会很困惑,原因是自由软件中的自由一词并不是他们所期望的那样.对他们而言自由意味着免费.一本英文字典 ...

  4. 《12个有趣的C语言问答》(4)

    C语言面试问答——<12个有趣的C语言问答>评析(4) 前文链接:http://www.cnblogs.com/pmer/p/3324063.html 8,Making changes i ...

  5. c语言,求字符数组的长度

    练手代码,适用初级码农: #include<stdlib.h> #include<stdio.h> #include<assert.h> int count(con ...

  6. 在MVC中添加异常增加日志

    MVC的结构非常棒,基本你能想到注入的地方都可以找到地方,譬如IActionFilter,IResultFilter,IAuthorizationFilter以及IExceptionFilter 以下 ...

  7. python 爬虫总结【转】

    1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com" response = urllib2.urlopen(url) ...

  8. JS左侧菜单-04

    <script language="javascript" type="text/javascript"> function HideShow() ...

  9. Asp.net Mvc4默认权限详细(上)

    Asp.net Mvc4默认权限详细(上) 前言 上篇的菜鸟去重复之Sql的问题还没有得到满意的答案.如果哪位大哥有相关的资料解释,能够分享给我,那就太谢谢了. 以后每发表一篇博文我都会将以前遗留的问 ...

  10. [置顶] 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 已经有好一段时间没有关注Android应用方面的事情了:)最近单位来了一个Androi ...