Breaseman算法绘制直线算法公式推导|步骤|程序
Breaseman算法绘制直线算法公式推导|步骤|程序
BreaseMan算法优点:
(1)不必计算直线的斜率,因此不用做除法;
(2)不用浮点数,只用整数;
(3)制作整数的加减乘除,和乘2操作,乘2操作可以直接用移位运算来处理;
(4)BresenMan算法的运算速度非常快。
明白了数学原理,我们很快能确定算法步骤:
1. 输入线段的起点和终点。
2. 判断线段的斜率是否存在(即起点和终点的x坐标是否相同),若相同,即斜率不存在,
只需计算y方向的单位步进(△Y+1次),x方向的坐标保持不变即可绘制直线。
3. 计算线段的斜率k,分为下面几种情况处理
a. k等于0,即线段平行于x轴,即程序只需计算x方向的单位步进,y方向的值不变
b. |k|等于1,即线段的x方向的单位步进和y方向的单位步进一样,皆为1。直接循环△X次计算x和y坐标。
4. 根据输入的起点和终点的x、y坐标值的大小决定x方向和y方向的单位步进是1还是-1
5. 画出第一个点。
7. 若|k| <1,设m =0,计算P0,如果Pm>0,下一个要绘制的点为(Xm+单位步进,Ym),
Pm+1 = Pm -2*△Y;
否则要绘制的点为(Xm+单位步进,Ym+单位步进)
Pm+1 = Pm+2*△X-2*△Y;
8. 重复执行第七步△X-1次;
9. 若|k| >1,设m =0,计算Q0,如果Qm>0,下一个要绘制的点为(Xm,Ym+单位步进),
Pm+1 = Pm -2*△X;
否则要绘制的点为(Xm+单位步进,Ym+单位步进)
Pm+1 = Pm+2*△Y-2*△X;
10. 重复执行第9步△Y-1次;
算法实现步骤二:
在算法实现之前,由上述的分析,则需要考虑的问题如下:
(1)因为BresenHam算法不考虑斜率,只需要考虑:选择X或者Y作为步进坐标轴,通过|delatX| 与|deltY|的比较获得;
即,如果|delatX| >= |deltY|,则选择X轴作步进坐标轴,反之,则选择Y作为坐标轴;
(2)步进轴的递进方向问题: deltY = endY - startY; deltX = endX - startY;通过比较 deltY,与deltX的符号获取;
即,如果endX >= startX , 则 X作为步进坐标轴步进为 +1,否则为 -1;
同理: endY >= startY , 则Y作为步进坐标轴步进为: +1, 否则为-1;
(3)因为不考虑斜率是否大于1,所以,我们选择“deltX”与deltY之间最大的作为步进边,即所在的坐标轴作为步进坐标轴;
即,在程序中,将变化最大的作为步进坐标轴,同时,要添加标记isInterchange,如果变化设置为true,然后在考虑Ym+1 的步进坐标的变化,即Xm+1的取舍Xm 或者Xm +/- 1;
(4)以下的程序实现,是以前面介绍的算法推导为基础,需要注意的是,因为此实现算法的步进迭代过程,与步进坐标轴是分开的,所以:如果下一个坐标的“不是步进坐标轴”的坐标轴变量只需要同时在绘制点时之前进行修改,而在修改步进坐标轴变量是不需要绘制“点”。
参考:
前面的博客:http://www.cnblogs.com/icmzn/p/5043365.html
(转载请注明出处:http://www.cnblogs.com/icmzn/p/5043436.html)
晚上的东西不能轻易相信,之前从网上download下一个程序,尼玛,程序是错误的,花了整个一个上午来修改这个程序,所以对待网上的东西不要轻易相信,要有批判的思维。
下面是我亲自调试通过后的程序:
(1)考虑了步进坐标轴的选取问题,以及其他问题。
void CCGProjectWorkView::bresenHam_Line(const int startPos[], const int endPos[], const float lineColor[])
{
glPushMatrix();
//绘制直线
float x, y, deltX, deltY, jugeFacor, temp;
//BresenMan算法实现
//起始点
x = startPos[];
y = startPos[];
//x或y方向的delt值
deltX = abs(endPos[] - startPos[]);
deltY = abs(endPos[] - startPos[]);
int sX, sY;//判定是否步进的方向
bool isInterchange = false;//斜率问题,xy是否需要交换绘制
if ((endPos[] - startPos[]) >= )//判定x方向的前后,
sX = ;
else
sX = -;//X反向递进
if ((endPos[] - startPos[]) >= )
sY = ;
else
sY = -;//Y反向递进
//根据斜率处理,deltX始终保持最大的数据
if (deltY > deltX)
{
temp = deltX;
deltX = deltY;
deltY = temp;
isInterchange = true;
}
//判定是Dupper - Dbotton ,所以符号 JugePactor < 0 ,取右上,> 0, 取右边,相对来说
jugeFacor = deltX - *deltY;//判定项,决定下一个坐标的取值问题
glColor3f(lineColor[], lineColor[], lineColor[]);
glBegin(GL_POINTS);
glVertex3f(x, y, );//在xoy平面绘制
for (int i= ; i < deltX; i++)
{
if (jugeFacor < )//只能取top,且符合左下闭合原则,即=0时,取下面位置
{//取右上位置(相对而言)
x += sX;
y += sY;
glVertex3f(x, y, );//绘制此点
jugeFacor = jugeFacor + *deltX - *deltY;
}
else
{//取botton, 取右边位置(相对而言),则只需要修改“步进”坐标轴变量
if (isInterchange)//xy斜率需要处理化,以y为单位步进方向
y += sY;
else
x += sX;
glVertex3f(x, y, );//绘制此点
jugeFacor = jugeFacor - *deltY; }
if (i == deltX- )
{
int stop = ;
}
}
glEnd();
glPopMatrix();
}
Breaseman算法绘制直线算法公式推导|步骤|程序的更多相关文章
- DDA_为微分绘制直线算法
DDA_为微分绘制直线算法 以步进坐标轴部长=1像素为单位,计算y=kx + b,绘制像素点(x, round(y)). 即步进坐标增长1, 另一坐标增长K或者1/k. 程序如下: //数值微分算法D ...
- opencv利用hough概率变换拟合得到直线后,利用DDA算法得到直线上的像素点坐标
图片霍夫变换拟合得到直线后,怎样获得直线上的像素点坐标? 这是我今天在图像处理学习中遇到的问题,霍夫变换采用的概率霍夫变换,所以拟合得到的直线信息其实是直线的两个端点的坐标,这样一个比较直接的思路就是 ...
- c# 动态绘制直线和曲线
c# 动态绘制直线和曲线 在本案例中利用Graphics对象动态地绘制直线和曲线.程序运行后,选择“直线”单选按钮,然后按下鼠标左键拖动鼠标就可以绘制直线,选择“曲线”单选按钮,然后移动鼠标就可以 ...
- Breaseman算法绘制圆形|中点算法绘制圆形_程序片段
Breaseman算法绘制圆形|中点算法绘制圆形_程序片段 1. Breaseman算法绘制圆形程序 由于算法的特殊性,限制绘制第一象限部分,其他部分通过旋转绘制. void CCGProjectWo ...
- 【OpenGL学习】 四种绘制直线的算法
我是用MFC框架进行测试的,由于本人也没有专门系统学习MFC框架,代码若有不足之处,请指出. 一,先来一个最简单的DDA算法 DDA算法全称为数值微分法,基于微分方程来绘制直线. ①推导微分方程如下: ...
- [AlgorithmStaff] Bresenham快速直线算法
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.3 | NativeC 最近在学习 Unity tilemap Brush 自定义笔刷功能时候,看到其 ...
- Bresenham’s algorithm( 布兰森汉姆算法)画直线
Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点.这个算法只会用到较为快速的整数加法.减法和位元移位,常用于绘制电脑画面中的直线.是计算机图形学 ...
- 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)
推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...
- 《图形学》实验五:改进的Bresenham算法画直线
开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...
随机推荐
- Delphi 操作键盘按下和释放操作
Unit Unit1; Interface Uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ...
- 疯狂JAVA——第五章 面向对象(上)
5.1类和对象 构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例.通过new关键字来调用构造器,从而返回该类的实例. 类名:每个单词首字母大写,其他字母小写,单词之间不要 ...
- MapReduce超时原因(Time out after 300 secs)
目前碰到过三种原因导致 Time out after 300 secs. 1. 死循环 这是最常见的原因.显式的死循环很容易定位,隐式的死循环就比较麻烦了,比如正则表达式.曾经用一个网上抄来的邮箱正则 ...
- grep匹配字符串出现的次数
背景:想要匹配一个html页面中某个字符出现的次数 遇到的问题: 用grep -c “xxx字符”得到的是行数,如果一行中有多个匹配到的字符,只会算作一个 解决方法: 使用grep - ...
- Loadrunner通过吞吐量计算每个用户需要的带宽
Loadrunner通过吞吐量计算每个用户需要的带宽 运行一个场景,点击Analysis进行分析,使用分析报告中的Average Throughput(bytes/second)进行计算. 计算公式: ...
- web项目生成web.xml的两种方式
做了很多的项目,今天着手写个小demo发现做web项目的时候还需要从别的地方去拷贝,那么如果没有地方可以拷贝,要怎么办呢?下边介绍三种方式生成web.xml文件. 一.maven项目情况:(STS版) ...
- UVa 10763 Foreign Exchange(map)
Your non-profitorganization (iCORE - international Confederationof Revolver Enthusiasts) coordinates ...
- TZOJ 4865 统计单词数(模拟字符串)
描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的 ...
- Java计算图的匹配率
2016-07-02 大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的.....R1有5个点P1有四个点,他们共同的点是4个,那就是共同点4*4/(R1的5个点*P1的四个点就是0 ...
- Ugly number丑数2,超级丑数
[抄题]: [思维问题]: [一句话思路]:Long.valueOf(2)转换为long型再做 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图 ...