光栅图形显示器可以看做一个像素的矩阵。在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素集合。本章介绍光栅图形学中几个重要的概念及基相应算法。
图形的扫描转换或光栅化
确定最佳逼近图形的像素集合,并用指定属性写像素的过程称为图形的扫描转换或光栅化。
区域填充
对于一维图形,在不考虑线宽时,用一个像素宽的直、曲线来显示图形;二维图形的光栅化必须确定区域对应的像素集,并用指定的属性或图案显示,即区域填充。
裁剪
任何图形进行光栅化时,必须显示在屏幕的一个窗口里,超出窗口的图形不予显示。确定一个图形的哪些部分在窗口内,必须显示;哪些部分落在窗口之外,不该显示的过程称为裁剪。(裁剪通常在扫描转换之前进行,从而可以不必对那些不可见的图形进行扫描转换。)
消隐
当不透光的物体阻挡了来自某些物体部分的光线,使其无法到达观察者时,这些物体部分就是隐藏部分。隐藏部分是不可见的,如果不删除隐藏的线或面,就可能发生对图的错误理解。为了使计算机图形能够真实地反映这一现象,必须把隐藏的部分从图中删除,习惯上称做消除隐藏线和隐藏面,或简称为消隐
走样
对图形进行光栅化时,由于显示器的空间分辨率有限,对于非水平、垂直、士45°的直线,因像素逼近误差,使所画图形产生畸变(台阶、锯齿)的现象称之走样(aliasing)。用于减少或消除走样的技术称为反走样(antialiasing)。 提高显示器的空间分辨率可以减轻走样程度,但这是以提高设备成本为代价的。实际上,当显示器的像素可以用多亮度显示时,通过调整图形上各像素的亮度也可以减轻走样程度。
本节的算法仅适用于$|k|\leqslant1$的情形。在这种情况下,$x$每增加$1$,$y$最多增加$1$。当$|k|\gt1$时,必须把$x,y$的地位互换,$y$每增加$1$,$x$相应增加$1 \over k$。$y$与$k$必须用浮点数表示,而且每一步都要对$y$进行四舍五入后取整,这使得该算法不利于硬件实现。
有限的点逼近无线的点
求出过$P_0P_1$的直线段方程,像素的坐标都是整数,要进行取整处理
$y=kx+b$
$k=\dfrac{y_1-y_0}{x_1-x_0}(x_1 {\not=}x_0)$
取消乘法提高效率?
采用增量的思想$\bold{DDA}$算法(数值微分法)
中点画线法
$\bold{Bresenham}$算法
中点画圆法
显示圆弧上8个对称点的算法如下:
void CirPoints(int x,int y,int color)
{
drawpixel(x,y,color);drawpixel(y,x,color);
drawpixel(-x,y,color);drawpixel(y,-x,color);
drawpixel(x,-y,color);drawpixel(-y,x,color);
drawpixel(-x,-y,color);drawpixel(-y,-x,color);
}
MidPointCircle(int r,int color)
{
inx x,y;
float d;
x=;y=r;d=1.25-r;
circliepoints(x,y,color);
while(x<=y)
{
if(d<0) d += 2*x+3;
else
{
d += 2*(x-y)+5;y--;
}
x++;
circlepoints(x,y,color);
}
}