說明:本文章系作者學習資料整理,不完善的地方請大家指正,謝謝!
摘自《計算機圖形學基礎教程》清華大學出版社 孫家廣 胡事民
我們知道利用任何畫圖工具,知道兩個點之後,便可以在窗口畫出一條直線,其計算機內部原理,便是利用了光柵化。計算機屏幕可以看作是有幾行幾列的單位正方形組成,在數學中線是沒有寬度的。當線與正方形的邊有交點時,我們需要判定選取正方形的哪個頂點作爲線上的一個點。這便引出了圖形掃描轉換的算法。
1概念
圖形掃描轉換或光柵化:確定最佳逼近圖形的像素集合,並用指定屬性寫像素的過程。
我們將直角座標系看作屏幕,用單元網格劃分。
2直線段掃描算法
(1)DDA算法-----digital differential analyzer 數值微分算法
其核心思想是在確定選取正方形的哪個頂點作爲直線上的點時,採用了四捨五入的方法。由已知兩點P1(x0,y0) 和P2(x1,y1) ,可以由直線方程 y=k*x+b 確定,
其中k=(y1-y0)/(x1-x0) ,b也可以確定。當|k|< = 1,我們沿着x軸的方向進行計算,x每次加一個x的增量,在這裏我們認爲是增量是1。因爲x的值已知,通過直線方程我們可以得到y值,然而y值未必是整數,在此算法中對y值進行四捨五入運算。而當|k|>1,我們沿着y軸的方向進行計算,y每次加1,由y值計算x的值,並對x值進行四捨五入運算。
當|k|<=1時,由迭代公式yi+1=k*xi+1+b 推出 yi+1=k*(xi+1)+b ; yi+1=k*xi+b+k
所以yi+1=yi+k;
當|k|>1時,由以上迭代公式推出 xi+1=(yi+1-b)/k ; xi+1=(yi+1-b)/k ; xi+1=(yi-b)/k+ 1/k;
所以 xi+1=xi+1/k;
僞代碼如下:
void DDALine(int x0,int y0,int x1,int y1) {
float k;
int dx= x1-x0 ,dy=y1-y0;
float k=dy/dx;
if (k >= -1&&k <= 1) {
int x;
float y;
for(x=x0;x < x1;x++)
{
drawpixel(x,int(y+0.5),color); //利用不同的軟件,此畫點的命令有所不同
y=y+k;
}
}
else {
int y;
float x;
for(y=y0;y<y1;y++)
{
drawpixel(int(x+0.5),y,color)
x = x + 1/k;
}
}
}
注:int(x+0.5)與round(x)的功能一樣,都是進行四捨五入運算。
缺陷:存在浮點數以及除法運算,計算速度慢。