OpenGL 使用Bresenham演算法繪製圓

2022-09-11 21:03:29 字數 1926 閱讀 2756

bresenham演算法繪製直線就不贅述了,大家看一看演算法簡介就能很好理解與實踐。

稍稍麻煩一點的就是用該演算法繪製圓了,演算法思想其實是一樣的,並沒有太大改變。

演算法核心:

組合以上式子,當dupper-dlower<0時,取上點;當dupper-dlower>0時,取下點;否則任意。

實驗過程中,我使用了兩種方法:① 畫點法 ② 連線法。

一、 畫點法:

畫點法就是僅僅用opengl繪製點。可以選擇按照圓的軌跡畫整個圓,當然這樣的演算法要比較慢,而且要注意分段函式的增減性。

我使用的是對稱法,利用圓的對稱性質,僅僅計算1/8的圓弧的點(當然算1/4也可以),其餘的點均用對稱性直接繪製。如下圖所示:

**如下:

1/*2

* 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 }

結果如圖(半徑150,圓心在原點,橫座標間隔為0.001):

二、 畫線法:

根據圓弧四個象限的增減性和凹凸性的不同,分別繪製四段曲線,組合成乙個圓。核心演算法和第一種方法相同。

1

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)

結果如圖(半徑150,圓心在原點,橫座標間隔為0.001):

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 平台的擴充套...