- 相關(guān)推薦
圖形的繪制方法
針對計算機輔助幾何造型中經(jīng)常用到的各種復雜邊界的平面圖形,基于OpenGL的NURBS曲面繪制及裁剪功能,提出了一種繪制復雜邊界平面圖形的方法,避免了對平面圖形進(jìn)行網(wǎng)格化處理。以下是小編搜索整理圖形的繪制方法,歡迎大家閱讀!
引言
在計算機輔助幾何造型領(lǐng)域,常常會(huì )用到各種具有復雜邊界的平面圖形,其邊界不僅有直線(xiàn),還可能有圓弧等各種曲線(xiàn)。目前OpenGL提供了繪制三角面以及凸多邊形的函數,沒(méi)有直接提供繪制凹多邊形及有曲線(xiàn)邊界的平面圖形的方法。但是其擁有強大的NURBS曲面繪制函數,可以繪制任意的NURBS曲面,并且可以裁剪繪制NURBS曲面。由于平面也可以看作是一種最簡(jiǎn)單的曲面,所以可以把OpenGL的NURBS曲面繪制功能借鑒到對平面圖形的繪制當中,實(shí)現對復雜邊界平面圖形的繪制。
文中圖形是在笛卡爾坐標系中的xoy平面上進(jìn)行討論的,對于不在這個(gè)平面上的圖形,也可以在其所在的平面上建立局部坐標系,再按照如下提到的方法進(jìn)行計算。
1 NURBS及其相關(guān)概念
NURBS是NonUniform Rational BSplines的縮寫(xiě),表示非均勻有理B樣條的意思。其核心思想在于用多個(gè)控制點(diǎn)來(lái)表示一條曲線(xiàn)或曲面。
1.1 NURBS控制點(diǎn)
在計算機輔助幾何造型中,常常用到各種各樣的曲線(xiàn),可以用簡(jiǎn)單解析式表示的曲線(xiàn)遠遠不能滿(mǎn)足要求。為了更方便地用來(lái)表示曲線(xiàn)、曲面形狀,可以用一系列點(diǎn)來(lái)控制和調節曲線(xiàn)、曲面的形狀,這些點(diǎn)被稱(chēng)為控制點(diǎn)。
在NURBS的理論中,控制點(diǎn)包含兩部分信息,一部分是點(diǎn)的坐標值,另一部分是點(diǎn)的權重。點(diǎn)的坐標值表示點(diǎn)在空間中的位置,點(diǎn)的權重值表示點(diǎn)對曲線(xiàn)或曲面的影響大小。三維空間上的控制點(diǎn)可以用四維向量表示,分別代表三個(gè)坐標和一個(gè)權重值。也可以用三維向量表示,這時(shí)權重默認為1.0。二維空間上的控制點(diǎn)可以用三維向量表示,代表兩個(gè)坐標值和一個(gè)權重,也可以用二維向量表示,此時(shí)權重默認為1.0。
1.2 NURBS曲線(xiàn)、曲面
NURBS曲線(xiàn)用空間中的一組控制點(diǎn)向量表示,每一個(gè)點(diǎn)都可以對曲線(xiàn)的形狀有一定的影響。NURBS曲面用空間中的一組控制點(diǎn)矩陣表示。根據NURBS的解析式,如果確定了控制點(diǎn),也就可以唯一確定一條曲線(xiàn)或者一條曲面。也正是由于NURBS的這種精確表示的特性,在計算機輔助幾何造型中得到了廣泛的應用。
2 幾種圖形的NURBS表示方法
2.1 曲線(xiàn)
本文僅對工程中最常見(jiàn)的線(xiàn)段和圓弧進(jìn)行討論,其它曲線(xiàn)可以參照NURBS公式計算其表示方法。
2.1.1 直線(xiàn)段
用2個(gè)控制點(diǎn)表示,2個(gè)控制點(diǎn)的坐標值為線(xiàn)段的端點(diǎn)坐標值,權重為1.0。
2.1.2 圓弧
需要按照圓弧的圓心角θ的大小討論,分以下情況:
對于0°<θ≤90°的圓弧,用3個(gè)控制點(diǎn)PA,PB,PC表示,其中兩端的控制點(diǎn)PA,PC的坐標值分別為圓弧的2個(gè)端點(diǎn)的坐標值,權重都為1.0。中間的點(diǎn)PB的坐標值為圓弧兩個(gè)端點(diǎn)處的兩條切線(xiàn)的交點(diǎn)坐標值,權重值weight計算公式為:weight=cos(θ2) 。
對于圓心角超過(guò)90°的圓弧(包括圓環(huán)),可以切成多段圓弧,每段圓弧都不超過(guò)90°,再把每段圓弧用上面的方法表示,即用多段圓弧來(lái)表示。
2.2 平面矩形
平面矩形用4個(gè)控制點(diǎn)表示,4個(gè)控制點(diǎn)的坐標為矩形4個(gè)角點(diǎn)的坐標值。為方便起見(jiàn),可以用三維向量表示,權重默認為1.0。
3 OpenGL中NURBS的特殊說(shuō)明
3.1 控制點(diǎn)
在OpenGL中表示帶權重的控制點(diǎn)有特殊的表示方法,對于控制點(diǎn)P,若其坐標為(x,y,z),權重為weight,則在OpenGL中表示該控制點(diǎn)的四維向量計算公式為:
=(xweight,yweight,zweight, weight)
(1)3.2 曲面裁剪函數
OpenGL中供曲面裁剪調用的函數是gluBeginTrim、gluEndTrim與gluNurbssCurve、gluPwlCurve。在進(jìn)行曲面裁剪開(kāi)始時(shí)調用gluBeginTrim函數,在結束時(shí)調用gluEndTrim函數。用gluNurbsCurve函數和gluPwlCurve函數繪制曲面邊界,其中g(shù)luNurbsCurve函數主要用于繪制曲線(xiàn)邊界,gluPwlCurve函數用于繪制直線(xiàn)邊界。為了統一表示,都采用了gluNurbsCurve函數。
4 圖形繪制數據計算
4.1 背景矩形繪制數據計算
對于任意一個(gè)平面有界圖形,都可以在其所在的平面上找到若干個(gè)矩形,使該圖形的所有部分都在矩形之中。在這些矩形中,兩邊與絕對坐標系的x軸與y軸平行且面積最小的矩形稱(chēng)為背景矩形。該矩陣與x軸方向平行的邊的長(cháng)度稱(chēng)為背景矩形的寬,與y軸平行的長(cháng)度稱(chēng)為背景矩形的高。該矩形的四條邊分別通過(guò)平面有界圖形在x、y軸方向上的最大最小值點(diǎn)。
該方法繪制的思路是先繪制背景矩形,再根據需要繪制平面有界圖形的幾何邊界,對背景矩形進(jìn)行裁剪,生成一個(gè)完整的圖形。
4.2 背景坐標系
從z軸的正方向看,以背景矩形的左下角點(diǎn)Pori(xori, yori)為原點(diǎn),三維空間中的x軸、y軸為坐標軸建立直角坐標系,這個(gè)坐標系稱(chēng)為背景坐標系,背景坐標系x軸的單位長(cháng)度設為背景矩形的寬,y軸的單位長(cháng)度設為背景矩形的高。 4.3 圖形邊界控制點(diǎn)在背景坐標系下坐標值的計算
由于只討論在xoy平面上的情況,所以不用考慮平面有界圖形上點(diǎn)的z軸坐標值,這樣邊界上任意一個(gè)控制點(diǎn)的絕對坐標只需要用(x,y)兩個(gè)坐標值表示。對于本文用到背景矩形,僅用到了在xoy平面上、而且兩邊都平行于坐標軸的矩形平面圖形,兩端控制點(diǎn)的節點(diǎn)參數設置為標準的0與1。裁剪邊界曲線(xiàn)上控制點(diǎn)在背景矩形上的UV坐標可以看作是在背景坐標系下的坐標。
對于邊界曲線(xiàn)上的控制點(diǎn),如果其絕對坐標為(x,y),則其在背景坐標系下的局部坐標(x', y')計算公式為:
x'
y'= x-xori
y-yori×1width 0
0 1height
(2)
其中width為背景矩形的寬,height為背景矩形的高。xori、yori為背景坐標系的原點(diǎn)坐標值。
計算好邊界曲線(xiàn)上的控制點(diǎn)后就可以確定裁剪曲線(xiàn)的繪制數據,邊界曲線(xiàn)上的控制點(diǎn)權重不變。
5 繪制流程
根據以上分析,可以采用以下的繪制流程來(lái)繪制一個(gè)平面圖形:①確定背景矩形;②確定背景坐標系;③求出圖形邊界曲線(xiàn)的控制點(diǎn)的絕對坐標及權重,并求出其在背景坐標系上的坐標;④按照OpenGL控制點(diǎn)的表示方法構造顯示數據;⑤調用NURBS曲面繪制函數繪制背景矩形;⑥調用NURBS曲面裁剪函數對繪制的背景矩形進(jìn)行裁剪,生成平面幾何圖形。
6 程序實(shí)例
為了檢測這種方法的有效性,選取了如圖1所示的圖形,該圖形包含直線(xiàn)邊界和圓弧邊界,而且有一個(gè)內部的孔。
按照本文的方法,在Dev-C++軟件中,結合C++程序設計語(yǔ)言,繪制出結果如圖 2所示的圖形。
可以看出用這種方法可以完整精確地繪制出所需的圖形。
7 結語(yǔ)
通過(guò)對xoy平面上的復雜邊界圖形的分析,利用OpenGL的曲面繪制及曲面裁剪功能,提出了一種可以方便繪制平面圖形的方法,按照這種思路,可以推廣應用到任意平面上的平面圖形繪制中,只需建立對應的平面坐標系即可。
【圖形的繪制方法】相關(guān)文章:
AI繪制蓮花的方法10-03
CAD圓的繪制方法08-31
在word中繪制虛線(xiàn)的方法10-19
cad矩形及圓弧的繪制方法10-29
CorelDRAW繪制水晶掛飾的方法07-15
CAD繪制多段線(xiàn)的方法07-31
學(xué)習CAD繪制基礎圖紙的方法09-03
竣工圖有哪些繪制方法06-28
繪制簡(jiǎn)單電路原理圖的方法10-06