bresenham演算法繪製直線就不贅述了,大家看一看演算法簡介就能很好理解與實踐。
稍稍麻煩一點的就是用該演算法繪製圓了,演算法思想其實是一樣的,並沒有太大改變。
演算法核心:
組合以上式子,當dupper-dlower<0時,取上點;當dupper-dlower>0時,取下點;否則任意。
實驗過程中,我使用了兩種方法:① 畫點法 ② 連線法。
一、 畫點法:
畫點法就是僅僅用opengl繪製點。可以選擇按照圓的軌跡畫整個圓,當然這樣的演算法要比較慢,而且要注意分段函式的增減性。
我使用的是對稱法,利用圓的對稱性質,僅僅計算1/8的圓弧的點(當然算1/4也可以),其餘的點均用對稱性直接繪製。如下圖所示:
**如下:
1/*2結果如圖(半徑150,圓心在原點,橫座標間隔為0.001):* draw circle by bresenham algorithm
3* @para < xc, yc - 圓心: (xc, yc) >
4* @para < r - 半徑 >
5* @para < deltax - 座標系每個小格的間距,用於控制精細度 >6*/
7void drawcircle_bresenham(glfloat xc, glfloat yc, glfloat r, const
glfloat deltax)
28glend();
29glflush();
30 }
二、 畫線法:
根據圓弧四個象限的增減性和凹凸性的不同,分別繪製四段曲線,組合成乙個圓。核心演算法和第一種方法相同。
1結果如圖(半徑150,圓心在原點,橫座標間隔為0.001):const glint first_qua = 1
; // 第一象限
2const glint second_qua = 2
; // 第二象限
3const glint third_qua = 3;4
const glint fourth_qua = 4;5
6/*7* 根據起點和終點繪製弧(畫線法)
8* @para < deltax - 座標系每個小格的間距,用於控制精細度 >
9* @para < quadrant - 象限 >
10*/
11void
setpixel(glfloat startx, glfloat endx, glfloat starty, glfloat xc, glfloat yc, glfloat r, glfloat deltax, glint quadrant)
24glend();25}
2627
/*28
* bresenham 演算法(畫線法)
29* @para < xc, yc - 圓心(xc, yc) >
30* @para < r - 半徑 >
31*/
32void
drawcircle_bresenham_line(glfloat xc, glfloat yc, glfloat r, glfloat deltax)
openGL 紋理使用
最近找了點資料學習了下opengl 紋理的使用 先有個 整體把握,然後再去看大部頭中的細節講解,感覺這樣的學習方式好些 總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本 op...
openGL 紋理使用
總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本opengl需要考慮寬度和高度不是的整數次方 2 分配乙個新的紋理編號 glgentextures 1,texture id ...
OpenGL擴充套件的使用
副檔名每個擴充套件都有乙個副檔名,副檔名類似如下形式 gl arb multitexture 第一段gl 用來表示針對 opengl 哪部分開發的擴充套件,有以下幾個值 gl 針對opengl 核心的擴充套件 wgl 針對windows 平台的擴充套件 glx 針對unix linux 平台的擴充套...