两种画线算法(DDA&Bersenham)
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画线算法为:
- 输入线段的两个端点,并将左端点储存在(x0,y0)中
- 将(x0,y0)装入帧缓存,画出第一个点;
- 计算常量△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)的更多相关文章
- Bresenham画线算法
[Bresenham画线算法] Bresenham是一种光栅化算法.不仅可以用于画线,也可以用用画圆及其它曲线. 通过lower与upper的差,可以知道哪一个点更接近线段: 参考:<计算机图形 ...
- cocos2d中两种移动的算法
在对cocos2d的sprite处理移动的过程中,通常用到的两种移动的算法: 假设这个CCNode是直接放在CCLayer上的 距离差法: CGPoint curTouchPosUI = [touch ...
- 计算机图形学(二)输出图元_3_画线算法_2_DDA算法
DDA算法 数字微分分析仪(digital differential analyzer, DDA)方法是一种线段扫描转换算法.基于使用等式(3.4)或等式(3.5)计算的&x或& ...
- 中点Brehensam画线算法
#include<stdio.h> #include<stdlib.h> #include"graphics.h" //函数声明 void MidBreha ...
- Bezier画线算法
编译器:VS2013 描述:Bezier画线是利用导数相同拼接曲线,使曲线十分光滑,而不是随意拼接观赏性很差 主函数段 #include "stdafx.h" #include&l ...
- DDA画线算法
#include<stdio.h> #include"graphics.h" #include<math.h> #include<stdlib.h&g ...
- matplotlib两种画散点图的方式
对于matplotlib.pyplot( as plt ) 先输入主体数据部分: import numpy as np import matplotlib.pyplot as plt X_train ...
- PHP两种基础的算法:冒泡、快速排序法》》》望能够帮助到大家
首先扯个淡@@@@@@@@@ 算法是程序的核心,一个程序的好坏关键是这个程序算法的优劣. 冒泡排序法 原理:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的 ...
- 两种缓存淘汰算法LFU&LRU
LRU全称是Least Recently Used,即最近最久未使用的意思. LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...
随机推荐
- 关于模板pair的用法
在挑战程序设计竞赛中看到调用pair,就上网查了一下 类型申明有两种 template <class T1, class T2> struct pair typedef pairt< ...
- 开始MVC5之旅
ASP.NET MVC 5-开始MVC5之旅 本教程将使用Visual Studio 2013手把手教你构建一个入门的ASP.NET MVC5 Web应用程序.本教程配套的C#源码工程可通过如下网 ...
- 随手复习一下委托:delegate
先骂个街,天儿太闷了…… 随手复习一下委托,delegate 是一种函数指针,是 .net 提供的一种安全的函数指针,翻译的也很贴切,像是委托人,又像代理人,通过“委托”来执行一些函数而不是直接调用它 ...
- T-SQL 随机返回特定行数据和分页查询
T-SQL 随机返回特定行数据和分页查询 T-SQL 语言相较于标准SQL添加了很多特性,为了提高SQL Server的表现,是有必要深入了解的,面试时一般也会包含这两个小问题. 首先,是在一个Adv ...
- 判断UA这种事不能说的太明。
[微博] Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; GT-I9502 Build/JDQ39) AppleWebKit/534.30 (KHTML, l ...
- journaling保证意外故障下的数据完整性
mongoDB研究笔记:journaling保证意外故障下的数据完整性 mongoDB的Journaling日志功能与常见的log日志是不一样的,mongoDB也有log日志,它只是简单记录了数据 ...
- struts2 action 接受数组参数为Null的问题
public List<FormulaDetail> formulaDetails; public List<FormulaDetail> getFormulaDetails( ...
- spring.net AOP配置基础
在第一篇中,我们用配置代理工厂的方式实现了面向切面记日志的功能.非常便捷的实现了AOP,但当我们需要对多个切入点配置通知的时候就需要声明多个代理工厂,这样导致配置文件内容过多,配置过程也很繁琐.spr ...
- Arduino 3G shield using SoftwareSerial to control
On the 3G shield, by default the power pin is on D8 and reset pin is on D9. Make it HIGH then it wor ...
- [置顶] Oracle学习经验谈
经常遇到朋友问oracle学习难不难,怎么才能成为高手等等,我想结合我的个人经验简单说几点: 1.打好基础,由浅入深 学习Oracle不能急于求成,寄希望于一天成为一个大侠.学习有个过程,应该由浅入深 ...