与方向无关的Bresenham算法
来源:互联网 发布:java 特种兵 pdf 编辑:程序博客网 时间:2024/06/11 07:46
写这篇文章的原因是因为发觉网络上太少关于计算机图形学算法的资料了,所以我希望从我这次完成计算机图形学大作业的例子给一些也正在学的人一些小小的帮助,即使不是些很高深的问题,但我更觉得我需要做的是扫盲。当然我写的也不是教程,只是针对一道题目而讨论。
题目:图元扫描转换算法改进:实现改进的画线算法(DDA或Bresenham),使得线段无论从哪个端点开始画,算法求出的象素点都是相同的(即与方向无关)。 (要求:交算法说明;源程序及详细注释;程序输出每一个象素点坐标)另外一个题目可能没有明确说到但是我们做的时候要按照的规定是:如果开始是起点A,终点B,你的改进算法是应该以B为起点,A为终点,但不能在程序中又把A变为起点,B为终点。
我手头上得到的一个Bresenham算法如下:
Bresenham_line(int x1 ,int y1,int x2 ,int y)
{ int dx,dy,s1,s2,temp,interchange=0,p,i;
float x,y;
dx = abs(x2 – x1); dy = abs(y2 – y1);
s1 = sign(x2 – x1); s2 = sign(y2 – y1); /*决定方向*/
x = x1 + 0.5*s1; y = y1 + 0.5*s2;
if(dy > dx){ /*决定m值*/
temp = dx; dx = dy; dy = temp; /*dx为增长快的边*/
interchange = 1;} /*在2,3,6,7区间*/
p = 2 * dy – dx;
for( i = 1; i <= dx; i++) {
setPixel(int(x), int(y));
if( p>0 ){
if(interchange)
x = x + s1; /*把xi当成yI */
else
y = y +s2;
p = p – 2 * dx;
}
if(interchange) /*当pi<=0,yi不变*/
y = y + s2; /*把yi当成xi*/
else
x = x + s1;
p = p + 2 * dy;
}/*for*/
}/* Bresenham_line */
因为Bresenham画线算法使用了最小的计算量,是最高效的单步画线算法,所以值得去研究这算法的改进,使得其与画线方向无关。
- 与方向无关的Bresenham算法
- 与方向无关的Bresenham算法
- 图形学算法--Bresenham算法的改进(综合各个方向)
- 直线的Bresenham算法
- 改进的Bresenham算法
- MFC bresenham直线算法与MidPoint画圆的总结
- 计算机辅助设计与图形学——Bresenham直线算法的实现
- delphi Bresenham算法生成坐标点,8个方向
- Bresenham直线算法的实现
- 生成直线的Bresenham算法
- 生成直线的Bresenham算法
- 生成直线的Bresenham算法
- Bresenham算法
- Bresenham算法
- Bresenham算法
- bresenham算法
- Bresenham算法
- Bresenham算法
- 给我一个方向,我能找到黄金!
- java.util.ConcurrentModificationException异常
- 哈夫曼树的实现
- 工作感悟
- 使用VMWare安装SAID3时的几个注意要点
- 与方向无关的Bresenham算法
- 一亿亿以下的阿拉伯数字转中文的自定义函数
- How to remove all characters between two brackets?
- 提高工作效率
- 领会RailsConf 2007
- 为什么没有Rails Inc?
- 多核的歇斯底里和线程的困惑
- RailsConf Europe 2007的注册开放了!
- 谚语