两种画线算法(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算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...
随机推荐
- Competitive
- mac在线恢复教程
上个周,我本来想升级一下Xcode,可是我的系统是10.8de,xcode5.0.1 最低支持10.8.4 所以就想升级一下我的mac的系统,可是因为我的appstore 是从别人的电脑上考过来的,要 ...
- Form.Close跟Form.Dispose
关于Form.Close跟Form.Dispose 我们在Winform开发的时候,使用From.Show来显示窗口,使用Form.Close来关闭窗口.熟悉Winform开发的想必对这些非常熟悉 ...
- Centos 64位 Install certificate on apache 即走https协议
Centos 64位 Install certificate on apache 即走https协议 一: 先要apache 请求ssl证书的csr 一下是步骤: 重要注意事项 An Importan ...
- cooking eggs
1: what is egg? what's the shape of it in details? 2: can egg run like this http://item.taobao.com/i ...
- the selected server is enabled,but is not configured properly.Deployment to it will not be permitted
用Tomcat添加部署项目的时候报错: the selected server is enabled,but is not configured properly.Deployment to it w ...
- Dreamer 框架 比Struts2 更加灵活
winter 改名为Dreamer. 这次发布第二个版本. 这次修复了很多BUG 和完善了部分功能. 1.改进用户服务层 以后在服务层中只需要继承BaseSupport 泛型类 就可以实现对对象进行增 ...
- 【数据压缩】LZ78算法原理及实现
在提出基于滑动窗口的LZ77算法后,两位大神Jacob Ziv与Abraham Lempel [1]于1978年又提出了LZ78算法:与LZ77算法不同的是LZ78算法使用树状词典维护历史字符串. [ ...
- OpenGL ES 响应屏幕旋转 iOS
iOS下使用OpenGL 如果使用GLKit View 那么不用担心屏幕旋转的问题,说明如下: If you change the size, scale factor, or drawable pr ...
- 关于CachedRowSetImpl类
全称: com.sun.rowset.CachedRowSetImpl 父类: javax.sql.rowset.BaseRowSet 实现的接口: javax.sql.RowSet javax.sq ...