提纲
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。