第二章:光栅图形学算法

1、光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度

2、由来:随着光栅显示器的出现,为了在计算机上处理、显示图形,需要发展一套与之相适应的算法。

3、研究内容:

1>直线段的扫描转换算法

2>多边形的扫描转换与区域填充算法

3>裁剪算法

4>反走样算法

5>消隐算法

一、直线段的扫描转换算法

1.为了显示一条直线,就在光栅显示器上用离散的像素点逼近直线,所以我们就要知道这些像素点的坐标

已知P0和P1,利用斜截式方程,y=kx+b,求出k=(y1-y0)/(x1-x0),b为截距

现在k,b已知,x,y未知,现在假设一个像素距离为y,即可求出y的值。

因为像素的坐标是整数,所以y值还要进行取整处理

2.在计算机中加法的运算更快,乘法较慢,故可以把上述方法优化来提高效率

1>数值微分法(DDA)

2>中点划线法

3>Bresenham算法

数值微分法(DDA)-----增量算法(只有一个加法)

这个式子的含义是:当前步的y值等于前一步的y值加上斜率k(增量)

例子:

思考:x递增1,y递增k,是否适合任意的k?

可改进的点:

1>一般情况下,k都是小数,且每一步均要对y四舍五入,唯一改进的途径是把浮点运算变为整数加法!

2>方程还有两点式,一般式

当|k|<=1时,伪代码如下:

voidDDALine(int x0,int y0,int x1,int y1,int color){

Int x;

Float dx,dy,y,k;

dx=x1-x0;dy=y1-y0;

K=dy/dx;y=y0;

For(x=x0,x<=x1;x++){

Drawpixel(x,int(y+0.5),color);//drawpixel(x, y, color)在(x, y)像素点绘制颜色为color的点

Y=y+k;

}

}

中点画线法

采用直线的一般式方程:Ax+By+C=0  F(x,y)=0,其中a = y0 - y1, b = x1 - x0,c = x0y1 - x1y0

令F(x, y)=0则得出直线方程,代入 (x0, y0)和(x1, y1),便可得到三个方程,可求出a,b,c的值

一条直线把平面分成了三个部分,直线上方,直线上,直线下方

x方向上+1,y方向上加不加1需判断

如何判断Q在M的上方还是下方?

把M点的坐标带入方程,其中a = y0 - y1, b = x1 - x0

分析计算量?

两个乘法,四个加法,推导出d的增量公式

d的初始值包含小数,因此可以用2d来代替d实现整数加法,所以d=2a+b

伪代码如下:

Void MidPointLine(int x0,int y0,int x1,int y1,int color){

Int a,b,delta1,delta2,d,x,y;

a=y0-y1;b=x1-x0;

d=2*a+b;

Delta1 = 2*a;

Delta2 =2*(a+b);

X = x0;

Y=y0;

//在对应的x,y像素点着色

putpixel(x,y,GREEN);

while(x<x1)

{

if(d<0)

{x++;y++;d+=delta2;}

else

{x++;d+=delta1;}

//在对应的x,y像素点着色

putpixel(x,y,GREEN);

}

Bresenham算法

每步的进化:

DDA把算法效率提高到每步只做一个加法

中点算法进一步把效率提高到每步只做一个整数加法

Bresenham算法提供了一个更一般的算法,该算法不仅有好的效率,而且有更广泛的适用范围

如何把算法的效率也提高到整数加法?

改进一:

令e=d-0.5

因为d的初值为0,

所以e的初值为-0.5,e=e+k,如果e>0,e=e-1

改进二:

在计算e值的情况下还是关于浮点数的计算,所以把浮点数化为整数。另外,k=dy/dx,再把dx取消,于是e`=e*2*△x,k`=k*2*△x

故e初=-△x,k=2*△y(要扩大多少倍,都扩大多少倍),e=e+2*△y

如果e>0,e=e-2*△x

算法步骤为:

  1. 输入直线的两端点P0(x0,y0),P1(x1,y1).
  2. 计算初始值,△x,△y,e=-△x,x=x0,y=y0.
  3. 绘制点(x,y)
  4. e更新为e+2△y,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;

否则(x,y)更新为(x+1,y).

  1. 当直线没有画完时,重复步骤3和4;否则结束。

伪代码如下:

Void BresenhamLine(int x0,int y0,int x1,int y1,int color){

Int e,x,y,dx,dy;

a=y0-y1;b=x1-x0;

e=-a;

X = x0;

Y=y0;

//在对应的x,y像素点着色

while(x<=x1)

{

putpixel(x,y,GREEN);

X++;

e+=2*dy;

if(e>=0)

{x++;y++;e-=-2a;}

//在对应的x,y像素点着色

putpixel(x,y,GREEN);

}

三种算法的总结:

DDA把算法效率提高到每步只做一个加法

中点算法进一步把效率提高到每步只做一个整数加法

Bresenham算法提供了一个更一般的算法,该算法不仅有好的效率,而且有更广泛的适用范围

转载于:https://www.cnblogs.com/keguniang/p/9665354.html

计算机图形学(三种画线算法)相关推荐

  1. 图形学画直线c语言,002计算机图形学之直线画线算法

    002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: y = kx +b 在显示器上显示直线的话,如果使用如上的方程,每描一个点 需要进行一次浮点乘法,一次浮点加法,和取整操作. ...

  2. 图形学画直线c语言,计算机图形学:3种画直线算法(转)

    //--------------------------------------------------------------------- //绘制直线的DDA算法基本函数 //--------- ...

  3. 计算机图形学画图形,计算机图形学(三种画线算法)(示例代码)

    第二章:光栅图形学算法 1.光栅显示器:光栅扫描式图形显示器简称光栅显示器,是画点设备,可看作是一个点阵单元发生器,并可控制每个点阵单元的亮度 2.由来:随着光栅显示器的出现,为了在计算机上处理.显示 ...

  4. java bresenham画直线_图形学笔记: Bresenham画线算法

    图形学课本, 按规矩介绍完矩阵行列式, 第一个算法肯定就是Bresenham画线算法了. 來我们來看看算法 Bresenham是用来画一些不反走样的线段的. 都说了线段肯定有起点和终点, 假设我们: ...

  5. 计算机图形学第一次上机——中点线算法和中点圆算法

    计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...

  6. 计算机图形学--方法篇(DDA画线算法)

    计算机图形学中所有的绘制算法都是用离散的点尽可能的去逼近理想的图形,本篇为大家介绍常见的几种画线算法. 首先啰嗦一下大家都懂得直线方程,假设有直线: x的增量,y的增量有这样的关系:    或 ​​​ ...

  7. 计算机图形学直线段的生成算法

    计算机图形学直线段的生成算法C++实现,包括:DDA,中点画线,改进的Bresenham画线 文章目录 1.实验目的和内容 1.1实验目的 1.2实验内容 2.算法原理 2.1 DDA(数值微分算法) ...

  8. 计算机图形学学习笔记(4.1)画线算法

    前言 现在的显示器都是像素点阵.但是图形在计算机中都用连续的线段或多边形等存储.因此在显示出来之前,要进行光栅化处理. 图形的光栅化(图形的扫描转换)分成两步: 1)根据图形的定义 在点阵单元上确定最 ...

  9. 【计算机图形学】扫面转换算法(DDA算法 中点画线算法 Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线.弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法.中点画线算法.Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值:如果绘 ...

最新文章

  1. java io流读写文件换行_java基础io流——OutputStream和InputStream的故事(温故知新)...
  2. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来
  3. python中字典的常用函数_Python字典dict常用方法函数实例
  4. java jdbc is一个会话_java_JdbcUtilis_单实例
  5. wireshark rto_RTO的完整形式是什么?
  6. 芝麻当家运营级商城源码/H5/小程序/网页
  7. MATLAB_平面几何_判断两平面矩形是否干涉
  8. mysql一秒查询次数_单个select语句实现MySQL查询统计次数
  9. 卡尔曼滤波,高斯函数
  10. 社会网络分析-python_体育社 - 运动让生活更有乐趣 - 俱乐部活动在线管理系统...
  11. MySQL/InnoDB中,对于锁的认识
  12. 深入浅出的mysql第三版和第二版的区别_1.高性能MySQL(第3版) 2. 深入浅出MySQL 合集 完整版 高清...
  13. aspen怎么做灵敏度分析_灵敏度分析_aspen
  14. 2008中国IT前瞻
  15. 度中心性(degree)、接近中心性(closeness)和中介中心性(betweenness)的理解
  16. 分布式自增序列id的实现(二) ---分布式序号生成器---基于Redis的自增功能
  17. Vmware安装深度Deepin图文
  18. 110 AddressBook
  19. 【论文合集】2022年10月医学影像期刊论文合集
  20. pycharm安装mysql驱动包

热门文章

  1. java学生成绩管理系统类图,学生成绩管理系统的用例类图
  2. PC市场老树发新芽,联想为何不惧挑战?
  3. spring boot微服务项目搭建
  4. KNN最近邻算法理解
  5. ListView控件和Adapter
  6. iPhone 13 120Hz屏幕稳了;AirPods Pro支持查找功能
  7. log 的抓取与分析
  8. 苹果手机闹钟声音大小怎么调_苹果闹钟不响、声音小怎么办?
  9. 人工智能(机器学习、深度学习等)专业名词、代码参数解释(持续更新)
  10. Tensorflow Python API 翻译(array_ops)