两种画线算法(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算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定的空间已 ...
随机推荐
- Maven中有三大模块
Maven中有三大模块 在Maven中有三大模块,分别是依赖.仓库.生命周期和插件,我们接下来下来介绍下依赖,为了方便起见我们还是以案例来说: 1.首先建立一个maven项目,这里我建立一个user的 ...
- 简单的mvc之三:灵活的路由(上)
在上一篇关于管线的随笔中已经提及了管线,通过对管线的分析,我们可以得到下面几个结论:路由系统由URLRoutingModule模块实现,它订阅了PostResolvRequestCache事件:路由系 ...
- 依赖注入(IOC)
依赖注入(IOC) 背景介绍 在设计模式中,尤其是结构型模式很多时候解决的就是对象间的依赖关系,变依赖具体为依赖抽象.平时开发中如果发现客户程序依赖某个或某类对象,我们常常会对他们进行一次抽象,形成抽 ...
- linux学习心得之目录树开端与/etc(图文)
linux学习心得之目录树开端与/etc(图文) linux中“一切皆文件”,学习linux一年了,在学习过程中对目录树的一点心得,分享给大家,有不对的地方敬请斧正. 不多说了,先上图: 根目录: / ...
- 实现了一个简单的key-value存储系统
实现了一个简单的key-value存储系统 源码下载: kvfs.rar 正文: 所谓的Key-Value就是每次存储一个数据时,是根据Key进行索引存储的.为了实现Key的快速查找功能,我使用了B- ...
- javascript 闭包基础分享
javascript 闭包基础分享 闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感觉,事实上,闭包的概念在函数式编程语言中算不上是难以理解的知识.如果对作用域,函数为独立的对象这 ...
- MAC上的包管理利器
Homebrew- MAC上的包管理利器 2013-07-01 16:25 by 黄博文, 76 阅读, 0 评论, 收藏, 编辑 包管理器是神马东西?让我们看看wikipedia上的介绍. In s ...
- 使用ServletContextListener和HttpSessionListener两种监听器实现记录当前网站在线人数
web.xml中配置: <listener> <listener-class>com.mcm.listener.ServletContextListenerImpl< ...
- ACE 容器之三 ACE_Unbounded_Queue的使用
以下代码演示了如何在ACE_Unbounded_Queue这个队列容器中存储具体的数据元素和数据元素的指针. // ACEqueue.cpp : Defines the entry point for ...
- C#中数组,ArrayList与List对象的区别
在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...