計算機圖形學習—— 直線段的掃描轉換算法

計算機可以使用兩種方式來顯示圖像:

一:點陣文件:又名:取樣圖像、點陣圖像、位圖圖像。從現實世界中通過數字化設備(掃描儀)獲取的圖。點陣文件縮放會失真,保存起來佔用空間比較大。

主要的參數有1. 圖像大小(分辨率):圖像分辨率=垂直分辨率(矩陣的行數)X水平分辨率(矩陣的列數)。

                      2. 顏色空間的類型(顏色模型):指彩色圖像所使用的顏色描述方法,指代RGB、YUV等。

                      3. 像素深度 :像素的所有顏色分量的二進位數之和   一般24位使用3字節表示就可稱爲真彩色。

常用圖像文件格式:bmp/tif/gif/jpeg/jpeg

1. BMP:無損,Windows使用的標準圖像格式,幾乎所有Windows應用軟件都支持

2. TIF:無損,大量用於掃描儀和桌面出版

3.GIF:無損,壓縮比可調,文件特別小——顏色數較少(不超過256色),用於色彩數要求不高的場合作爲插圖、剪貼畫等使用,支持透明背景,具有漸進顯示功能,形成動畫效果,適合網絡傳輸

4. JPEG:大多有損,適用範圍最廣(國際標準)、可支持有損壓縮、主要應用領域之一是數碼相機

5.JP2(JPEG 2000):有損/無損,特別採用了小波分析等先進算法,兼容JPEG,壓縮率更高,比JPEG好,更適合網上傳輸

二、矢量文件:使用數學方程,形狀參數等。矢量文件中的圖形元素稱爲對象。每個對象都是一個自成一體的實體,它具有顏色、形狀、輪廓、大小和屏幕位置等屬性。矢量圖相比於位圖很多優點,可以無限放大或縮小,且不會有任何損失,文件體積較小,編輯靈活。

 


直線算是計算機圖形入門的最最基礎的了,就從它入手了!那麼在屏幕上如何畫出一條直線呢。

由圖可以看出我們需要一定的算法來進行選擇像素點來保證畫出的直線是比較理想的。

當然畫出一條直線我們使用數學方程 y = Kx + b.當我們確定兩點的座標很容易計算出斜率K的值跟b的值,然後該改變x的值就能求出y的值,反之依然。

當然一些一些座標值的整數變化:

p(1.7,0.8)------->取整 p(1,0) 這樣誤差比較大,我們採用 p(1.7,0.8)------->+0.5   p(2.2,1.3)------->取整 p(2,1)

計算機速度固然很快,可是這樣成千上百此的調用速度方面也會略顯不足,每次計算要使用乘法還要一次四捨五入,所以我們要改進算法更加高效。有三種改進的方法,此下一一介紹:

一、數值微分法(DDA)是一種基於直線的微分方程來生成直線的方法。

數學推導過程:採用別人的圖片,嘿嘿偷懶了!

將乘法轉換成加法會極大的增加運算的速度。

void DDA(float x1, float y1, float x2, float y2)//x1,y1起始點,x2,y2終止點
{    int i, temp;    
    int x0 = 0, y0 = 0;         //座標軸原點    
    float x, y, delta_x, delta_y, dx, dy;    
     
    dx = x2 - x1;    
    dy = y2 - y1;    
    if (fabs(dx) >= fabs(dy))        //確定斜率K是正還是負,確定採用x座標爲基準還是Y座標
        temp = fabs(dx);            //求出絕對值
    else        
        temp = fabs(dy);    

    delta_x = float(1.0*dx / temp);     //一個值爲1.0,一個值小於1.0   
    delta_y = float(1.0*dy / temp);    
    x = x1;
    y = y1;    
    
    putpixel((x + x0), (y0 - y),顏色);         //畫點    
    for (i = 1; i <= temp; i++)     
    {        
        x = x + delta_x;        
        y = y + delta_y;    
        putpixel((x + x0), (y0 - int(y + 0.5)), 顏色);        //y+0.5四捨五入運算        
        Sleep(50);                                          //兩個點間隔50毫秒    
    }
}

二、中點畫線法

 

三、Bresenham算法

下次寫---待續

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章