其他分享
首页 > 其他分享> > 2.4 图形思维的起点——朴素的软光栅(1)

2.4 图形思维的起点——朴素的软光栅(1)

作者:互联网

提纲

  DDA算法

  中点的Bresenham算法

  改进的Bresenham算法

扫描转换的概念

 

 

 

 

 

 

光栅化指的就是输入图形的定义(比如三角形的定义,三个几何坐标以及属性信息:颜色光照纹理等),通过找到最佳逼近的像素点并且给像素指定合适的颜色值的过程。

GPU中有一个专门的光栅化阶段,通过硬件完成此过程。也可以在GPU着色之前,通过软件进行该过程,称为软光栅。

 

 

 

 

最基本的图形扫面转换方法

约定(为像素点建立坐标系)

输入点的坐标,输出点的像素位置

直线

高质量直线的要求(要直,端点要准确,即无定向性和断裂情况,亮度色泽均匀,画线的速度快,还能处理不同的线宽、颜色、线型)

直线扫描转换算法(逐点比较法、正负法、数值微分算法、Bresenham算法)

点和直线

DDA算法(数值微分法Digital Differential Analyzer)

一种直接从直线的微分方程生成直线的方法。

 

 

 

 

 最大位移方向

 斜率小于1或者斜率大于1

 

 

 

 最大位移方向的重要性:如果不分辨最大位移方向,始终在x方向递增1单位的步长,那么当斜率大于1时,会把直线画成离散的点。

 

 

 改进

计算像素点位置的最后一步本来四进行四舍五入,如果在原本坐标值上加上统一的0.5,再取整,可以简化计算。

 DDA直线生成算法(C语言)

void DDAline(int x0,int y0,int x1,int y1)
{
int dx,dy,eps1,k;
float x,y,xIncre,yIncre;
dx=x1-x0; dy=y1-y0;
x=x0; y=y0;
If (abs(dx)>abs(dy)) eps1=abs(dx);//最大位移方 向的判断
else eps1=abs(dy);
xIncre=(float)dx/(float)eps1;//x、y方向上 增量的计算
yIncre=(float)dy/(float)eps1;
for (k=0;k<=eps1;k++)
{
putpixel((int)(x+0.5),(int)(y+0.5));//在对应坐标处输出像素点
x+=xIncre;
y+=yIncre;
}
}

 

DDA直线算法特点

优点:DDA算法直观、易实现

缺点:有浮点数和浮点运算,效率不高

增量算法(效率不够高)

 

中点的Bresenham算法

 

基本原理

 

 

 

 

 

 

 

 

举例:

 用我自己的语言概括:斜率逐次累加,直到累加和大于阈值(初始是1/2),这时把累加和减1。

改进的Bresenham算法

 

 

标签:直线,float,Bresenham,算法,dy,DDA,光栅,朴素,2.4
来源: https://www.cnblogs.com/BoysCryToo/p/15737099.html