图形学画直线c语言,002计算机图形学之直线画线算法
002计算机图形学之直线画线算法
我们知道直线方程的斜截式是如下的样子:
y = kx +b
在显示器上显示直线的话,如果使用如上的方程,每描一个点
需要进行一次浮点乘法,一次浮点加法,和取整操作。
DDA算法 digital differential analyzer
对斜截式进行转换成如下:
$y_{k+1}=y_{k}+m$
由此我们可以根据起点依次推算到最后一个点,实现如下:
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 = x0, y = 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 = 0; k < steps; k++) {
x += xIncrement;
y += yIncrement;
//SetPixel(round(x), round(y));
}
}
优点
取消了乘法,计算速度更快。
缺点
浮点增量连续增加,取证误差会积累
取整操作和浮点运算仍然十分耗时
Bresenham画线算法
主要思想是,由于我们在缓存区上画点,全部是整数。那么在画线的时候,当斜率k小于1的时候,下一个点是取(x+1,y+1)还是(x+1,y)取决于点(x+1,y+0.5)是在该直线的上方或者下方,从而将可以通过判断一个参数的的符号来得到下一个点的位置,提高了代码的效率。
算法可以表达为如下:
|m|<1 时的Bresenham画线算法
输入线段的两个端点,并将左端点存储在(x0,y0)中;
将(x0,y0)装入帧缓存,绘制第一个点;
计算常量△x, △y 2△y 和2△y-2△x,并得到决策参数的第一个值:
$p_0 = 2△y - △x$
从k=0开始,如果pk<0,则下一个点是(/x_k+1,yk),并且
$p_{k+1} = p_k + 2△y$
否则,下一个绘制点是(xk+1,yk+1),并且
$p_{k+1} = p_k+2△y-2△x$
重复步骤4,共△x-1次。
考虑到xy平面各种八分和四分区域的对称性,此算法对任意斜率的线段具有通用性。
图形学画直线c语言,002计算机图形学之直线画线算法相关推荐
- java bresenham画直线_图形学笔记: Bresenham画线算法
图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...
- 计算机图形学第一次上机——中点线算法和中点圆算法
计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...
- 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 计算机图形学c语言实践,计算机图形学及其实践教程
图书简介 本教材全面论述计算机图形学的基本原理.方法及其应用.本书首先对计算机图形学的应用.计算图形系统作了介绍,然后对计算机图形学系统原理.基本图元的生成技术.图形变换.交互技术.三维图形表示及真实 ...
- 计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...
计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 (1)算法设计原理 依次处理(p1,q1)(p2,q2)(p3,q3 ...
- 【计算机图形学】中点画线法实现任意斜率直线的绘制
[计算机图形学]中点画线法实现任意斜率直线的绘制 一.中点画线法原理简介 1.建立基础 中点画线法的建立基础是数值微分画线法(DDA),其作为改进算法,沿用了DDA算法的增量思想,针对影响DDA算法效 ...
- 计算机图形学---DDA直线画法c#实现
计算机图形学-DDA直线画法c#实现 DDA直线画法,即数值微分法,是计算机图形学中直线段扫描转换的经典算法之一,本篇文章将简单介绍DDA算法,并给出c#实现的代码. 一.DDA直线画法 设直线的斜截 ...
- c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...
VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...
- 计算机图形学学习笔记(4.1)画线算法
前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...
最新文章
- Perforce 使用说明
- 【PC工具】开源绿色windows右键管理工具软件
- simulink仿真设置
- 前端学习(305):bootstrap4之工具方法
- 北斗三号b1c频点带宽_重磅北斗星通新一代22nm北斗高精度定位芯片正式发布
- 文字生成视频,只需一步
- Illustrator中文版教程,如何在 Illustrator 中创建几何图案?
- 心跳包、乒乓包、SO_KEEPLIVE
- 谷歌浏览器安装插件教程步骤,开发用这2个插件工作效率倍增
- java后台数据传到前台的流程_java serlve后台数据传到前台
- IntelliJ IDEA pycharm webstorm 激活
- BAT用户画像数据浅析
- golang 实现数据结构-顺序栈
- java系列之redis基础
- 理解RemoteViews——RemoteViews的内部机制
- 内网安全-arp欺骗,dns劫持钓鱼
- 《日语综合教程》第七册 第五課 読み物 雄弁な寡黙
- DRV8301/8303代码讲解
- 计算机更改用户名修改注册表出问题,改注册表没权限?无论什么账户这么做就好...
- CPU频率被限制在0.8GHz
热门文章
- 音乐编辑 java_音乐制作软件怎么用?教你编辑音频文件的方法
- 股票学习知识:一股行业全球领先 大跌后主力逾8亿大买附股
- adb 查看磁盘占用_如何使用adb 指令查看机器序列号
- 评测三款最流行的epub阅读器(ios手机适用)
- 基于MFC的五子棋(详细介绍,适合初学者)
- Java23种设计模式——模板模式
- 解决部分app调用摄像头失败(只有一个usbcamera)这里只是一部分(参考)
- 18V降压5V,15V降压5V的芯片方案选型问题
- 系统自适应,Ctrl+滚轮缩放界面等比例放大(页面不乱)
- SpringDataJpa系列三之QBE(按照实例对象查询)