版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第三章基本圖形生成算法提出問題
如何在指定的輸出設備上根據(jù)坐標描述構造基本二維幾何圖形(點、直線、圓、橢圓、多邊形域、字符串及其相關屬性等)。圖形生成算法基礎只有畫水平線,垂直線,及正方形對角線時,象素點集的位置才是準確的。在光柵顯示器上顯示一條直線,實際上是用最靠近這條直線的象素點集來近似地表示這條直線。特點:畫點設備有限象素的矩陣光柵顯示器:
緩沖存儲器,顯示控制器,數(shù)/模轉換器,陰級射線管(CRT)。
A(x1,y1)、B(x2,y2)、圖形的生成:是在指定的輸出設備上,根據(jù)坐標描述構造二維幾何圖形。圖形的掃描轉換:在光柵顯示器等設備上確定一個最佳逼近于圖形的象素集的過程。
用一系列的象素點來逼近直線圖形的掃描轉換是完成圖形的參數(shù)表示形式(由圖形軟件包的使用者指定)到點陣表示形式(光柵顯示器刷新時所需要的表示形式)的轉換。
對圖形的掃描轉換一般分為兩個步驟:先確定有關像素,再用圖形的顏色或其他屬性對像素進行某種寫操作。研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字生成直線的一般要求:4.最后直線的生成速度要快;
1.象素是均勻分布的;
2.所畫的線應是直的,且有精確的起點和終點;
3.所顯示的亮度應沿直線不變,且與直線的長度和方向無關;3.1
直線的掃描轉換數(shù)學上理想直線的特點:1.直線沒有寬度2.有無數(shù)個點構成的集合DDA畫線法中點畫線法Bresenham畫線算法5.要求直線具有不同的色澤、亮度、線型等。已知端點A(x0,y0)、B(x1,y1),直線的微分方程:dy/dx=(y1-
y0)/(x1-x0)=k=常數(shù)
=k*xi+B+k*Δx
yi=k*xi+BΔx(x,round(y))yi+1=k*xi+1+B=k*(xi+Δx)+B光柵中Δx=1直線的遞推公式
yi+1=y(tǒng)i+(y1-y0)/(x1-x0)xi+1=xi+1yi+1=y(tǒng)i+k*Δx3.1.1
DDA畫線算法程序(|k|≤1)通過同時對x,y各增加一個小的增量,計算下一步的x,y值。在一個迭代算法中,如果每一步的x,y值是用前一步的值加上一個增量來獲得,那么這種算法稱為增量算法。DDA(DigitalDifferentialAnalyzer)畫線算法也稱數(shù)值微分法,它的算法實質是用數(shù)值方法解微分方程,通過同時對x和y各增加一個小增量,計算下一步的x、y值。例子討論:oxy|k|≤1yi+1=yi+1xi+1=xi+1/k(xi,yi)(xi+1,yi+1)oxy|k|>1(xi,yi)(xi+1,yi+1)造成隔行顯示xi+1=xi+1yi+1=yi+k結論:直線DDA算法:(round(xi+1),yi+1)yi+1=yi+1xi+1=xi+1/k|k|>1(xi+1,round(yi+1))xi+1=xi+1yi+1=yi+k|k|≤1逼近直線的象素點的坐標直線上點的坐標遞推公式直線的斜率起點(x1,y1),終點(x2,y2)(x2>x1,y2>y1)以(x1,y1)為起點DDA算法評價比直接使用公式
y=k*x+b快,沒有用乘法;設置增量的除法運算、取整操作和浮點運算仍然耗時,不利于硬件實現(xiàn);DDA算法是一個增量算法。
通過同時對x,y各增加一個小的增量,計算下一步的x,y值。在一個迭代算法中,如果每一步的x,y值是用前一步的值加上一個增量來獲得,那么這種算法稱為增量算法。拋磚引玉
中點畫線法
Bresenham畫線算法假設斜率k在0、1之間。假設x坐標為xp的各像素點中,與直線最近者已確定,為P(xp,yp),那么,下一個與直線最近的像素只能是正右方的P1(xp+1,yp),或右上方的P2(xp+1,yp+1)兩者之一。令M為P1和P2的中點,易知M的坐標為(xp+1,yp+0.5)。設Q是理想直線與垂直線x=xp+1的交點。顯然,若M在Q的下方,則P2離直線近,應取為下一個像素;否則應取P1。3.1.2
中點畫線算法假設直線的起點和終點分別是(x0,y0)和(x1,y1)。則直線方程為:
F(x,y)=ax+by+c=0;其中a=y0-y1,b=x1-x0,c=x0y1-x1y0。該直線方程將平面分為三個區(qū)域:對于直線上的點,F(xiàn)(x,y)=0;對于直線上方的點F(x,y)>0;對于直線下方的點,F(xiàn)(x,y)<0。xyF(x,y)>0F(x,y)=0F(x,y)<0
直線將平面分為三個區(qū)域xyF(x,y)>0F(x,y)=0F(x,y)<0判別式:則有:
d=F(M)=F(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c中點畫線算法生成直線的原理QP2(xp+1,yp+1)P(xp,yp)P1(xp+1,yp)M(xp+1,yp+0.5)3<+=)0()0(1dydyy誤差項的遞推d≥0:d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)+c=d+ad≥0P(xp,yp)(xp+1,yp+0.5)(xp+2,yp+0.5)結論:d的增量為a誤差項的遞推d<0:d2=F(xp+2,yp+1.5)=d+a+b=a(xp+2)+b(yp+1.5)+c
d<0P(xp,yp)(xp+1,yp+0.5)(xp+2,yp+1.5)結論:d的增量為a+b初始值d的計算d0=F(x0+1,y0+0.5)=a(x0+1)+b(y0+0.5)+c=ax0+by0+c+a+0.5b=F(x0,y0)+a+0.5b=a+0.5b0≤k≤1時中點畫線算法的算法步驟為:1.輸入直線的兩端點P0(x0,y0)和p1(x1,y1)。2.計算初始值a=y0-y1、b=x1-x0、d=a+0.5b、x=x0、y=y0;3.繪制點(x,y)。判斷d的符號;若d<0,則(x,y)更新為(x+1,y+1),d更新為d+a+b;否則(x,y)更新為(x+1,y),d更新為d+a。4.當直線沒有畫完時,重復步驟3。否則結束。改進:用2d代替d1.輸入直線的兩端點P0(x0,y0)和p1(x1,y1)。2.計算初始值a=y0-y1、b=x1-x0
、d=2*a+b、x=x0、y=y0、d1=2*a、d2=2*(a+b)。3.繪制點(x,y)。判斷d的符號。若d<0,則(x,y)更新為(x+1,y+1),d更新為d+d2;否則(x,y)更新為(x+1,y),d更新為d+d1。4.當直線沒有畫完時,重復步驟3。否則結束。程序因此,中點畫線算法的運算速度很快,并適于用硬件實現(xiàn)。(1)不必計算直線的斜率,因此不必作除法;(2)不用浮點數(shù),只用整數(shù);(3)只有加法和乘2運算,在計算機內(nèi)部是用位移操作實現(xiàn)的,效率高。中點畫線算法的優(yōu)點:中點畫線算法基本思想
:
借助于一個決策變量d的正負符號,來確定下一個該點亮的象素點。算法總結假定直線段的0≤k≤1基本原理:3.1.3
Bresenham畫線算法
Brensemham算法繪制直線的原理ddddkkkkk誤差項的計算d初=0,每走一步:d=d+k一旦y方向上走了一步,d=d-1算法步驟:1.輸入直線的兩端點P0(x0,y0)和P1(x1,y1)。2.計算初始值△x、△y、d=0、x=x0、y=y0。3.繪制點(x,y)。4.d更新為d+k,判斷d的符號。若d>0.5,則(x,y)更新為(x+1,y+1),同時將d更新為d-1;否則(x,y)更新為(x+1,y)。5.當直線沒有畫完時,重復步驟3和4。否則結束。改進1:令e=d-0.5e初=-0.5,每走一步有e=e+k。if(e>0)thene=e-1算法步驟為:1.輸入直線的兩端點P0(x0,y0)和P1(x1,y1)。2.計算初始值△x、△y、e=-0.5、x=x0、y=y0。3.繪制點(x,y)。4.e更新為e+k,判斷e的符號。若e>0,則(x,y)更新為(x+1,y+1),同時將e更新為e-1;否則(x,y)更新為(x+1,y)。5.當直線沒有畫完時,重復步驟3和4。否則結束。改進2:用2e△x來替換ee初=-△x,每走一步有e=e+2△y。if(e>0)thene=e-2△x算法步驟:1.輸入直線的兩端點P0(x0,y0)和P1(x1,y1)。2.計算初始值△x、△y、e=-△x、x=x0、y=y0。3.繪制點(x,y)。4.e更新為e+2△y,判斷e的符號。若e>0,則(x,y)更新為(x+1,y+1),同時將e更新為e-2△x;否則(x,y)更新為(x+1,y)。5.當直線沒有畫完時,重復步驟3和4。否則結束。程序因此,Bresenham畫線算法的運算速度很快,并適于用硬件實現(xiàn),是應用最廣泛的畫直線算法。(1)不必計算直線的斜率,因此不必作除法;(2)不用浮點數(shù),只用整數(shù);(3)只有加法和乘2運算,在計算機內(nèi)部是用位移操作實現(xiàn)的,效率高。Bresenham畫線算法的優(yōu)點:算法總結研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字3.2.1簡單方程產(chǎn)生圓弧算法原理:利用其函數(shù)方程,直接離散計算[]
)(2R0,
x121211+++-=?+=iiiixRroundyxx3.2
圓的掃描轉換解決的問題:繪出圓心在原點,半徑為整數(shù)R的圓x2+y2==R2圓的極坐標方程為:
)sin(
)cos()(
11111+++++==DD+=iiiiiiRroundyRroundxqqqqqq為一固定角度步長圓的標準方程包括乘法和平方根運算;圓的極坐標參數(shù)方程包含乘法和三角運算。存在問題yx3.2
圓的掃描轉換3.2.2圓的對稱性(y,x)(-y,x)(-x,y)(-x,-y)(-y,-x)(y,-x)(x,-y)(x,y)yy=-xy=xyy=x1/8圓弧xR3.2.3
中點畫圓法構造函數(shù)F(x,y)=x2+y2-R2。R為整數(shù)。對于圓上的點,有F(x,y)=0;對于圓外的點,F(xiàn)(x,y)>0;而對于圓內(nèi)的點,F(xiàn)(x,y)<0。當d≤0時,下一點取Pu(xi
+1,yi);當d>0時,下一點取Pd(xi
+1,yi-1)。M的坐標為:M(xi
+1,yi-0.5)當F(xM,yM)<0時,取Pu(xi
+1,yi)當F(xM,yM)>0時,取Pd(xi
+1,yi-1)當F(xM,yM)=0時,約定取Pu。構造判別式:xy中點畫圓算法原理PPuPdM算法原理誤差項的遞推,d≤0:
d>0:
判別式的初始值:算法步驟:1.輸入圓的半徑R。2.計算初始值d=1.25-R、x=0、y=R。3.繪制點(x,y)及其在八分圓中的另外七個對稱點。4.判斷d的符號。若d≤0,則先將d更新為d+2x+3,再將(x,y)更新為(x+1,y);否則先將d更新為d+2(x-y)+5,再將(x,y)更新為(x+1,y-1)。5.當x<y時,重復步驟3和4。否則結束。改進:將1.25-R≈1-R(因為R為整數(shù)),算法步驟:1.輸入圓的半徑R。2.計算初始值d=1-R、x=0、y=R。3.繪制點(x,y)及其在八分圓中的另外七個對稱點。4.判斷d的符號。若d≤0,則先將(x,y)更新為(x+1,y),再將d更新為d+2x+3;否則先將(x,y)更新為(x+1,y-1),再將d更新為d+2(x-y)+5。5.當x<y時,重復步驟3和4。否則結束。程序實例P0=1-10=-9
P1=-9+2*1+1=-6P2=-6+2*2+1=-1P3=-1+2*3+1=6P4=6+2*(4-9)+1=-3P5=-3+2*5+1=8P6=8+2*(6-8)+1=5iPi(xi,yi)0-9(0,10)1-6(1,10)2-1(2,10)36(3,10)4-3(4,9)58(5,9)65(6,8)(7,7)中點畫圓法實例(r=10)012345678910012345678910思想判斷公式算法描述程序實現(xiàn)舉例xkxk+1ykyk-1yk-23.2.4
Bresenham畫圓算法Bresenham
算法思想現(xiàn)在從A點開始向右下方逐點來尋找弧AB要用的點。如圖中點Pi-1是已選中的一個表示圓弧上的點,根據(jù)弧AB的走向,下一個點應該從Hi或者Li中選擇。顯然應選離AB最近的點作為顯示弧AB的點。假設圓的半徑為R,顯然,當xhi2+yhi2-R2≥R2-(xli2+yli2)時,應該取Li
。否則取Hi
。令di=xhi2+yhi2+xli2+yli2-2R2顯然,當di
≥0時應該取Li
。否則,取Hi
。Pi-1HiLi應取Hi還是取LiABBresenham畫圓算法公式推導剩下的問題是如何快速的計算di
。設圖中Pi-1的坐標為(xi-1,yi-1)
,則Hi和Li的坐標為(xi,yi-1)和(xi,yi-1-1)
di=xi2+yi-12+xi2+(yi-1-1)2-2R2=2xi2+2yi-12-2yi-1-2R2+1Pi-1HiLi應取Hi還是取LiBresenham畫圓算法公式推導當di<0時->取Hi->
yi=yi-1
,則di+1=(xi+1)2+yi-12+(xi+1)2+(yi-1-1)2-2R2=2xi2+2yi-12-2yi-1-2R2+1+4xi+2=di+4xi-1+6Pi-1HiLi應取Hi還是取LiBresenham畫圓算法公式推導當di
≥0時->取Li->yi=yi-1-1
,則di+1=(xi+1)2+(yi-1-1)2
+(xi+1)2+(yi-1-2)2-2R2=2xi2+2yi-12-2yi-1-2R2+1+4xi-4yi-1+6=di
+4(xi-1-yi-1)+10Pi-1HiLi應取Hi還是取LiABBresenham畫圓算法公式推導
求di的初始值d0
di=xi2+yi-12+xi2+(yi-1-1)2-2R2=2xi2+2yi-12-2yi-1-2R2+1d0=2x02+2y-12-2y-1-2R2+1=2+2R2-2R-2R2+1=3-2RPi-1HiLi應取Hi還是取Li注意:Pi-1(xi-1,yi-1)xi-1=0,yi-1=RXi=xi-1+1=1Bresenham畫圓算法的步驟1)
輸入圓半徑r和圓心(xc,yc),
獲得第一個點:(x0,y0)=(0,R)2)計算P0=3–2R;3)根據(jù)公式計算Pk+1,確定下一點;
如果pk<0,選擇(xk+1,yk)
pk≥0,
選擇(xk+1,yk-1)4)確定對稱點;5)重復步驟3),直至x≥yBresenham畫圓算法舉例(R=10)P0=3-20=-17
P1=-17+4*0+6=-11P2=-11+4*1+6=-1P3=-1+4*2+6=13P4=13+4*(3-10)+10=-5P5=-5+4*4+6=17P6=17+4*(5-9)+10=11k0123456Pk-17-11-113-51711(xk,yk)(0,10)(1,10)(2,10)(3,10)(4,9)(5,9)(6,8)(7,7)Bresenham畫圓算法舉例(R=10)012345678910012345678910xyY=xBresenham算法以決策參數(shù)的增量計算為基礎,僅包括簡單的整數(shù)處理。中點方法更易應用于其他圓錐曲線,沿任何圓錐曲線所確定的像素位置,其誤差限制在像素分段的1/2以內(nèi)。算法總結研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字3.3
橢圓的掃描轉換3.3.1橢圓的特征baxy
長半軸為a,短半軸為b的標準橢圓(x,y)(x,-y)(-x,-y)(-x,y)對于橢圓上的點,有F(x,y)=0;對于橢圓外的點,F(xiàn)(x,y)>0;對于橢圓內(nèi)的點,F(xiàn)(x,y)<0??紤]橢圓圓心在原點,長半軸為a短半軸為b的橢圓(a,b為整數(shù))以弧上斜率為-1的點作為分界將第一象限橢圓弧分為上下兩部分。
上半部分下半部分二分量相等的法向量第一象限的橢圓弧yx引理3-1:若在當前中點,法向量的y分量比x分量大,即
而在下一個中點,不等號改變方向,則說明橢圓弧從上部分轉入下部分。法向量:上半部分下半部分二分量相等的法向量第一象限的橢圓弧yx3.3.2
橢圓的中點算法算法原理:Pu橢圓的中點繪制算法原理yxPdPPlPrP先推導上半部分的橢圓繪制公式:p(xi,yi)pu(xi+1,yi)pd(xi+1,yi-1)M(xi+1,yi-0.5)上半部分橢圓弧的繪制原理判別式:若d1≤0,取Pu(xi+1,yi);若d1>0,取Pd(xi+1,yi-1)p(xi,yi)pu(xi+1,yi)pd(xi+1,yi-1)M(xi+1,yi-0.5)
上半部分橢圓弧的繪制原理誤差項的遞推d1≤0:誤差項遞推d1>0:判別式的初始值
B數(shù)值為初始化的y數(shù)值誤差項遞推演示(橢圓上半部分)再來推導橢圓弧下半部分的繪制公式。原理如下:p(xi,yi)pl(xi,yi-1)pr(xi+1,yi-1)M(xi+1,yi-0.5)下半部分橢圓弧的繪制原理判別式
:若d2>0,取Pl(xi,yi-1);若d2≤0,取Pr(xi+1,yi-1)p(xi,yi)pl(xi,yi-1)pr(xi+1,yi-1)M(xi+1,yi-0.5)下半部分橢圓弧的繪制原理誤差項的遞推d2>0:誤差項的遞推d2≤0:
注意:上半部分的終止判別;下半部分誤差項的初值;算法步驟:1.輸入橢圓的長半軸a和短半軸b。2.計算初始值d=b2+a2(-b+0.25)、x=0、y=b。3.繪制點(x,y)及其在四分象限上的另外三個對稱點。4.判斷d的符號。若d≤0,則先將d更新為d+b2(2x+3),再將(x,y)更新為(x+1,y);否則先將d更新為d+b2(2x+3)+a2(-2y+2),再將(x,y)更新為(x+1,y-1)。5.當b2(x+1)<a2(y-0.5)時,重復步驟3和4。否則轉到步驟6。6.用上半部分計算的最后點(x,y)來計算下半部分中d的初值:7.繪制點(x,y)及其在四分象限上的另外三個對稱點。8.判斷d的符號。若d≤0,則先將d更新為b2(2xi+2)+a2(-2yi+3),再將(x,y)更新為(x+1,y-1);否則先將d更新為d+a2(-2yi+3),再將(x,y)更新為(x,y-1)。9.當y>0時,重復步驟7和8。否則結束。程序實例研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字3.4
多邊形的掃描轉換與區(qū)域填充簡單邊界,例如多邊形,圓,橢圓以及其他簡單曲線,通過掃描線與邊界交點確定填充區(qū)域。復雜邊界,從內(nèi)部給定位置開始填充,遞歸填充直至邊界。掃描線填充算法掃描線多邊形填充算法(3.4.1)邊緣填充算法(3.4.2)邊緣填充算法柵欄填充算法邊標志算法遞歸填充算法邊界填充算法(3.4.3)洪泛填充算法(3.4.4)3.4.1掃描線多邊形填充算法算法思想算法技巧如何處理奇數(shù)個交點?如何處理水平邊?如何計算交點坐標?數(shù)據(jù)結構算法描述
算法思想
掃描線自底向上掃描,計算掃描線與多邊形邊界的交點確定填充區(qū)間,再用要求的顏色顯示這些區(qū)間的像素,即完成填充工作。一條掃描線的填充過程分為求交、排序、配對和填色四個步驟。x-掃描線算法填充多邊形xy213356789111234567891011121012算法技巧–交點數(shù)單調(diào)減單調(diào)增掃描線y1掃描線y2算法技巧–水平邊不計算水平邊和掃描線的交點算法技巧–交點坐標計算交點坐標計算
Yi+1=
Yi+
1
Xi+1=
xi+
1/mm=dy/dxYi+1yiXi+1xi數(shù)據(jù)結構輸入?yún)?shù)頂點數(shù)以及頂點坐標數(shù)據(jù)結構有序邊表sortededgetable活化邊表activeedgetableBACC’DE01YAYDYCWindowheightAEABCDDECB最大Y值較低頂點X值1/m有序邊表構建過程:按頂點輸入順序依次形成邊,存儲到每條邊最小Y值所對應的掃描線位置(水平邊除外),相同最小Y值的邊按較低頂點X值升序排序。有序邊表typedef
structtEdge
{intyUpper;floatxIntersect;floatdxPerScan;struct
tEdge*next; }Edge;01YAYDYCWindowheightAEABCDDECB最大Y值較低頂點X值1/m活化邊表CDDEAEABABCC’DE掃描線Y把與當前掃描線相交的邊稱為活化邊,并把它們按與掃描線交點x坐標遞增的順序存放在一個鏈表中,形成活化邊表。算法描述1)輸入多邊形頂點數(shù)及頂點坐標;2)建立有序邊表;3)根據(jù)當前掃描值建立活化邊表;4)求出掃描線與多邊形邊界交點,交點配對、填充;5)更新活化邊表并重新排序;6)進入下一條掃描線,重復步驟3,直至掃描線值為窗口高度。算法步驟3.4.2
邊緣填充算法邊緣填充算法算法簡單,但對于復雜圖型,每一象素可能被訪問多次柵欄填充算法柵欄指的是一條過多邊形頂點且與掃描線垂直的直線。它把多邊形分為兩半。邊標志算法分為兩個步驟:
(1)打標記
(2)填充基本思想:幀緩沖器中對多邊形的每條邊進行直線掃描轉換,亦即對多邊形邊界所經(jīng)過的象素打上標志。然后再采用和掃描線算法類似的方法將位于多邊形內(nèi)的各個區(qū)段著上所需顏色。使用一個布爾量inside來指示當前點是否在多邊形內(nèi)的狀態(tài)。算法過程:voidedgemark_fill(polydef,color)多邊形定義polydef;
intcolor;{對多邊形polydef
每條邊進行直線掃描轉換;
inside=FALSE;for(每條與多邊形polydef相交的掃描線y)for(掃描線上每個象素x){if(象素x被打上邊標志)inside=!(inside);if(inside!=FALSE)
drawpixel(x,y,color);elsedrawpixel(x,y,background); }}用軟件實現(xiàn)時,掃描線算法與邊界標志算法的執(zhí)行速度幾乎相同,但由于邊界標志算法不必建立維護邊表以及對它進行排序,所以邊界標志算法更適合硬件實現(xiàn),這時它的執(zhí)行速度比有序邊表算法快一至兩個數(shù)量級。IDEA–填充區(qū)域邊界以一種顏色指定;從區(qū)域的一個內(nèi)部點開始,由內(nèi)至外繪制直到邊界。適用于單色邊界3.4.3邊界填充算法填充方式4-連通8-連通問題4連通有時不能完整填充算法的輸入:種子點坐標(x,y),填充色和邊界顏色。棧結構實現(xiàn)4-連通邊界填充算法的算法步驟為:種子象素入棧;當棧非空時重復執(zhí)行如下三步操作:(1)棧頂象素出棧;(2)將出棧象素置成填充色;(3)檢查出棧象素的4-鄰接點,若其中某個象素點不是邊界色且未置成多邊形色,則把該象素入棧。4-連通算法描述voidBoundaryFill4(intx,int
y,int
boundarycolor,int
fillcolor){intcolor=getPixel(x,y); if(color!=fillcolor&&color!=boundarycolor) { setPixel(x,y,fillcolor); BoundaryFill4(x,y+1,boundarycolor,fillcolor); BoundaryFill4(x,y-1,boundarycolor,fillcolor); BoundaryFill4(x-1,y,boundarycolor,fillcolor); BoundaryFill4(x+1,y,boundarycolor,fillcolor);}}邊界表示的4連通區(qū)域的遞歸填充算法:棧結構實現(xiàn)8-連通邊界填充算法的算法步驟為:種子象素入棧;當棧非空時重復執(zhí)行如下三步操作:(1)棧頂象素出棧;(2)將出棧象素置成填充色;(3)檢查出棧象素的8-鄰接點,若其中某個象素點不是邊界色且未置成多邊形色,則把該象素入棧。特點:把太多的象素壓入堆棧,堆棧空間需求量非常大改進 通過沿掃描線填充水平象素段,來代替處理4-鄰接點和8-鄰接點。沿掃描線填充水平象素段的4-連通邊界填充算法步驟:種子象素入棧;當棧非空時作如下三步操作:(1)棧頂象素出棧;(2)填充出棧象素所在掃描行的連續(xù)象素段,直到遇到邊界象素為止,即每出棧一個象素,就對包含該象素的整個掃描線區(qū)間進行填充;(3)在區(qū)間中檢查與當前掃描線相鄰的上下兩條掃描線的有關象素是否全為邊界象素或已填充的象素,若存在非邊界、未填充邊界的象素,則把每一區(qū)間的最右象素取作種子象素入棧。IDEA–
填充區(qū)域以一種顏色指定;從指定的內(nèi)部點
(x,y)開始,將填充色賦給顏色為給定內(nèi)部色的鄰接像素。適用于多色邊界3.4.4泛填充算法算法的輸入:種子點坐標(x,y),填充色和內(nèi)部點的顏色。算法原理:算法從指定的種子(x,y)開始,用所希望的填充顏色賦給所有當前為給定內(nèi)部顏色的象素點。8-連通泛填充算法步驟如下:種子象素入棧;當棧非空時重復執(zhí)行如下三步操作:(1)棧頂象素出棧;(2)將出棧象素置成填充色;(3)檢查出棧象素的8-鄰接點,若其中某個象素點不是給定內(nèi)部點的顏色且未置成新的填充色,則把該象素入棧。內(nèi)點表示的4連通區(qū)域的遞歸填充算法:voidFloodFill4(intx,int
y,int
oldcolor,int
newcolor){if(getpixel(x,y)==oldcolor)//屬于區(qū)域內(nèi)點oldcolor { drawpixel(x,y,newcolor); FloodFill4(x,y+1,oldcolor,newcolor); FloodFill4(x,y-1,oldcolor,newcolor); FloodFill4(x-1,y,oldcolor,newcolor); FloodFill4(x+1,y,oldcolor,newcolor);}}注意:當以邊界表示時,4-連通邊界填充算法只能填充4-連通區(qū)域,8-連通邊界填充算法也只能填充8-連通區(qū)域。當以內(nèi)點表示時,8-連通泛填充算法可以填充8-連通區(qū)域也可以填充4-連通區(qū)域,當然4-連通泛填充算法還是只能填充4-連通區(qū)域。3.4.5
其他相關的概念1.內(nèi)-外測試不自交的多邊形、自相交的多邊形奇-偶規(guī)則(Odd-evenRule)
從任意位置p作一條射線,若與該射線相交的多邊形邊的數(shù)目為奇數(shù),則p是多邊形內(nèi)部點,否則是外部點。非零環(huán)繞數(shù)規(guī)則(NonzeroWindingNumberRule)首先使多邊形的邊變?yōu)槭噶?。將環(huán)繞數(shù)初始化為零。再從任意位置p作一條射線。當從p點沿射線方向移動時,對在每個方向上穿過射線的邊計數(shù),每當多邊形的邊從右到左穿過射線時,環(huán)繞數(shù)加1,從左到右時,環(huán)繞數(shù)減1。處理完多邊形的所有相關邊之后,若環(huán)繞數(shù)為非零,則p為內(nèi)部點,否則,p是外部點。研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字3.52D裁剪裁剪定義Clipping
識別圖形在指定區(qū)域內(nèi)或區(qū)域外的過程->裁剪裁剪的時機
(1)針對窗口邊界裁剪
(2)針對視區(qū)邊界裁剪裁剪類型點裁剪直線裁剪多邊形區(qū)域裁剪曲線裁剪(自學)文字裁剪3.5.1
點的裁剪點(x,y)如果滿足下列不等式則保留:w1<=x<=w2
w3<=y<=w4w1w2w3w4(x,y)3.5.2直線段的裁剪假定直線段用p1(x1,y1)p2(x2,y2)表示。直線段和剪裁窗口的可能關系:完全落在窗口內(nèi)完全落在窗口外與窗口邊界相交
窗口
直線段與窗口的關系ABCDEFHGIJ實交點是直線段與窗口矩形邊界的交點。虛交點則是直線段與窗口矩形邊界延長線或直線段的延長線與窗口矩形邊界的交點。
窗口
實交點與虛交點ABCDEFHGIJ虛交點實交點實交點實交點虛交點虛交點Cohen-Sutherland直線裁剪算法Liang梁友棟-Barsky直線裁剪算法中點分割算法Nicholl-Lee-Nicholl直線裁剪算法Cyrus-Beck算法(自學)直線段的裁剪算法1.Cohen-Sutherland直線裁剪算法基本思想:直線由端點標識;測試直線端點和窗口邊界的關系以確定是否需要計算交點
;CS編碼方案擴展窗口的邊界將整個2D平面劃分為9個區(qū)域每個區(qū)域賦予一個4位編碼,稱為區(qū)域碼000001100100010100100001100110001010上下右左w1w2w3w4編碼規(guī)則b0=1iffx<w1b1=1iff
x>w2b2=1iffy<w3b3=1iffy>w4000001100100010100100001100110001010上下右左w1w2w3w4算法描述計算直線端點編碼,c1和c2;判斷c1和c2均為0000,保留直線c1&c2不為零,同在某一邊界外,刪除該直線c1和c2不均為0000
且c1&c2為零,需要進一步求解交點以L,R,B,T為序,將x=w1/w2或y=w3/w4帶入直線方程,計算直線與窗口邊界的交點,將交點和另一端點重復上述過程,直至線段保留或刪除CS線段裁剪算法舉例P3P41000001100100010100100001100110001010CS線段裁剪算法舉例132P1P2000001100100010100100001100110001010算法的步驟:(1)輸入直線段的兩端點坐標:p1(x1,y1)、p2(x2,y2),以及窗口的四條邊界坐標:wyt、wyb、wxl和wxr。(2)對p1、p2進行編碼:點p1的編碼為code1,點p2的編碼為code2。(3)若code1|code2=0,對直線段應簡取之,轉(6);否則,若code1&code2≠0,對直線段可簡棄之,轉(7);當上述兩條均不滿足時,進行步驟(4)。(4)確保p1在窗口外部:若p1在窗口內(nèi),則交換p1和p2的坐標值和編碼。(5)按左、右、上、下的順序求出直線段與窗口邊界的交點,并用該交點的坐標值替換p1的坐標值。也即在交點s處把線段一分為二,并去掉p1s這一段??紤]到p1是窗口外的一點,因此可以去掉p1s。用p1替代s轉(2)。(6)用直線掃描轉換算法畫出當前的直線段p1p2。(7)算法結束。
計算線段P1(x1,y1)P2(x2,y2)與窗口邊界的交點
if(LEFT&code!=0) { x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} elseif(RIGHT&code!=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} elseif(BOTTOM&code!=0){ y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);}elseif(TOP&code!=0){ y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);}程序實現(xiàn)p1p2p3p41321舉例。程序流程圖優(yōu)點:簡單,易于實現(xiàn)。算法中求交點的次數(shù)決定了算法的速度,最壞要求交三次,反復循環(huán)。在裁剪窗口非常大或非常小時效率很高。CS線段裁剪算法小結2Liang-Barsky直線裁剪算法思想:基于直線段參數(shù)方程分析的快速直線裁剪算法。參數(shù)方程
直線兩端點P1(x1,y1),P2(x2,y2) x=x1+(x2-x1)u y=y1+(y2-y1)u,0≤u≤1已知直線端點:起點P1(x1,y1),終點P2(x2,y2)參數(shù)方程: x=x1+(x2-x1)u y=y1+(y2-y1)u
P1P2u<00≤u≤1u>1LB算法推導
如果直線在窗口內(nèi),則
w1≤x1+dx*u≤w2 w3≤y1+dy*u≤w4
統(tǒng)一表示為:Pk
*u≤
Qkk=1,2,3,4P1=-dx,Q1=x1-w1P2=dx,Q2=w2-x1P3=-dy,Q3=y1-w3P4=dy,Q4=w4-y1w1w2w3w4ubulutur01dxdyP1=-dx,Q1=x1-w1P2=dx,Q2=w2-x1P3=-dy,Q3=y1-w3P4=dy,Q4=w4-y1算法描述計算Pk,Qk,k=1~4Pk=0,表示直線平行于窗口某邊界Qk<0,(任一小于零)直線完全在窗口外,被裁剪Qk>=0,直線在窗口內(nèi),平行邊界內(nèi)對Pk<>0的情形,用Qk/Pk計算交點所對應的u值對每條線計算參數(shù)u1&u2u1=Max({Qk/Pk|Pk<0}
U
{0})u2=Min({Qk/Pk|Pk>0}
U
{1})如果u1>u2,則直線在窗口外,否則計算交點坐標
x(u)=x1+dx*uy(u)=y1+dy*uLB線段裁剪算法例1已知線段的兩個端點P1(3,4),P2(8,2)
窗口邊界x=1,x=4,y=1,y=3用LB算法對線段進行裁剪線段的參數(shù)方程x=3+5u y=4-2uP1=-5,Q1=2,R1=-2/5 P2=5,Q2=1,R2=1/5 P3=2,Q3=3,R3=3/2 P4=-2,Q4=-1,R4=1/2u1=max(0,-2/5,1/2)=1/2 u2
=
min(1,
1/5,
3/2)
=
1/5u1>u2
所以線段全部被裁剪線段的兩個端點(-2,-1)和(1,1.5)窗口邊界x1=-1,x2=1,y1=-1,y2=1LB線段裁剪算法例2△x=3,△y=2.5p1=-3 q1=-1 r1=1/3p2=3 q2=3 r2=1p3=-2.5 q3=0 r3=0p4=2.5 q4=2 r1=4/5對于p<0,u1=max{0,1/3,0}=1/3對于p>0,u2=min{1,1,4/5}=4/5則u1<u2,則可見線段的端點坐標:x=x1+u1△x=-1,y=y1+u1△y=-1/6
即(-1,-1/6)x=x1+u2△x=2/5,y=y1+u2
△y=1
即(2/5,1)voidLB_LineClip(x1,y1,x2,y2,XL,XR,YB,YT)floatx1,y1,x2,y2,XL,XR,YB,YT;{ floatdx,dy,u1,u2;
tl=0;tu=1; dx=x2-x1;dy=y2-y1;if(ClipT(-dx,x1-Xl,&u1,&u2)if(ClipT(dx,XR-x1,&u1,&u2)if(ClipT(-dy,y1-YB,&u1,&u2)if(ClipT(dy,YT-y1,&u1,&u2){ displayline(x1+u1*dx,y1+u1*dy,x1+u2*dx,y1+u2*dy) return; }}程序實現(xiàn)boolClipT(p,q,u1,u2)floatp,q,*u1,*u2;{floatr;if(p<0){ r=q/p; if(r>*u2)returnFALSE; elseif(r>*u1) { *u1=r; returnTRUE; }}
。。。//下頁elseif(p>0){ r=p/q; if(r<*u1)returnFALSE; elseif(r<*u2){ *u2=r;returnTRUE;}}elseif(q<0)returnFALSE;returnTRUE;}LBvs.CS LB效率高于CS,因為減少了交點計算次數(shù)。
參數(shù)u1和u2的更新需要四次除法,交點坐標計算至多4次乘法。Liang-Barsky和Cohen-Sutherland算法很容易擴展為三維裁剪算法3中點分割裁剪算法基本思想:與前一種Cohen-Sutherland算法一樣首先對線段端點進行編碼,并把線段與窗口的關系分為三種情況:全在、完全不在和線段和窗口有交。對前兩種情況,進行一樣的處理。對于第三種情況,用中點分割的方法求出線段與窗口的交點。求線段與窗口的交點A、B分別為距P0、P1最近的可見點,Pm為P0P1中點問:算法為什么可行?會不會無限循環(huán)、不斷二分?從出發(fā)找最近可見點的方法先求出的中點若不是顯然不可見的,并且在窗口中有可見部分,則距最近的可見點一定落在上,所以用代替;否則取代替再對新的求中點。重復上述過程,直到長度小于給定的控制常數(shù)為止,此時收斂于交點。從出發(fā)找最近可見點采用上面類似方法。 中點分割算法的核心思想是通過二分逼近來確定直線段與窗口的交點。舉例4NLN直線裁剪算法IDEA
通過在裁剪窗口周圍創(chuàng)立多個區(qū)域,并在求交運算之前進行更多的區(qū)域測試,從而避免對直線段進行多次剪裁。適用范圍僅僅適用于2D剪裁算法步驟從P1點向窗口的四個角點發(fā)出射線,這四條射線和窗口的四條邊界直線一起將二維平面劃分為更多的小區(qū)域。線段端點P1的三種位置Case1Case2Case3ACase3BP2位置?
比較直線段P1P2的斜率和剪裁區(qū)域邊界的斜率.yt-y1y2-y1yt-y1xr-x1x2-x1xl-x1交點計算p2裁剪類型點裁剪直線裁剪多邊形區(qū)域裁剪曲線裁剪(自學)文字裁剪3.5.3
多邊形的裁剪問題的提出:
裁剪算法Sutherland-Hodgman
算法Weiler-Atherton算法多邊形的裁剪算法1.Sutherland-Hodgeman多邊形裁剪基本思想:以多邊形頂點為初始集合,首先用窗口左邊界剪裁多邊形,產(chǎn)生新的頂點序列。新的頂點集依次傳給右邊界、下邊界和上邊界進行處理。SH算法最終輸出定義剪裁后的多邊形邊界的頂點序列。輸入:ABCDEFGHABCDEFGH輸出:A12DEFGH12用左邊界裁剪ADGH1用上邊界裁剪345678輸入:A134D5678GH輸出:K34D56789IHJ9IJK沿多邊形依次處理頂點有四種情況 剪裁情況一Sout,Pin;由外至內(nèi)輸出i和p
P:secondoutputSINOUTi:firstoutput剪裁情況二S&Pbothin;由內(nèi)至內(nèi)輸出PPolygonbeingclippedP:outputClipboundarySINOUT剪裁情況三Sin,Pout由內(nèi)至外輸出iINOUTSioutputP剪裁情況四S&Pbothout由外至外無頂點輸出
(nooutput)PSINOUT123456窗口左邊界Example1234561'2'3'4'5'窗口左邊界1234561'2'3'4'5'窗口左邊界算法改進
只有當窗口的四個邊界都確定一個點在窗口內(nèi)時才加入到輸出頂點表中V1V2V3V1’V2’V2’’V3’問題
SH算法適用于凸多邊形多余線段Weiler-Atherton算法
2Weiler-Atherton多邊形裁剪算法思想:通過修改多邊形頂點處理順序(考慮頂點處理方向),從而正確顯示凹多邊形。若順時針處理多邊形頂點,采用下列規(guī)則:對由外到內(nèi)的頂點對,沿著多邊形邊界的方向;對由內(nèi)到外的頂點對,按順時針沿窗口邊界的方向。Weiler算法適用于任意多邊形裁剪區(qū)域Weiler-Atherton算法步驟假定按順時針方向處理頂點,且將用戶多邊形定義為Ps,窗口矩形為Pw。算法從Ps的任一點出發(fā),跟蹤檢測Ps的每一條邊,當Ps與Pw相交時(實交點),按如下規(guī)則處理:(1)若是由不可見側進入可見側,則輸出可見直線段,轉(3);(2)若是由可見側進入不可見側,則從當前交點開始,沿窗口邊界順時針檢測Pw的邊,即用窗口的有效邊界去裁剪Ps的邊,找到Ps與Pw最靠近當前交點的另一交點,輸出可見直線段和由當前交點到另一交點之間窗口邊界上的線段,然后返回處理的當前交點;(3)沿著Ps處理各條邊,直到處理完Ps的每一條邊,回到起點為止。下圖示了Weiler-Atherton算法裁剪凹多邊形的過程和結果。ABCDECEV1V2V3V4V1V2V3V4
Weiler-Atherton算法裁剪凹多邊形(a)裁剪前(b)Weiler-Atherton算法的裁剪結果返回返回3.5.4
其它裁剪1.曲線邊界對象的裁剪曲線邊界對象與矩形窗口和多邊形窗口的裁剪加速方法;2.文字裁剪 文字裁剪的策略包括幾種:串精度裁剪字符精度裁剪筆劃、象素精度裁剪
3.外部裁剪 保留落在裁剪區(qū)域外的圖形部分、去掉裁剪區(qū)域內(nèi)的所有圖形,這種裁剪過程稱為外部裁剪,也稱空白裁剪。字符裁剪串精度:將包圍字串的外接矩形對窗口作裁剪字符精度:將包圍字的外接矩形對窗口作裁剪以及筆畫\象素精度:將筆劃分解成直線段對窗口作裁剪
待裁剪字符串 串精度裁剪 字符精度裁剪象素精度裁剪研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充2D裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字字符指數(shù)字、字母、漢字等符號。計算機中字符由一個數(shù)字編碼唯一標識。“美國信息交換用標準代碼集”簡稱ASCII碼。它是用7位二進制數(shù)進行編碼表示128個字符漢字編碼的國家標準字符集。每個符號由一個區(qū)碼和一個位碼(2字節(jié))共同標識。3.6字符處理基本術語字體:一組字符的完整設計風格字模:一組按照特定尺寸和風格設計的字符模板圖案。字符字模構成方式點陣式-----位圖字體矢量式-----輪廓字體字庫:儲存每個字符的字模編碼信息,分為矢量字庫和點陣字庫兩大類型。Def.-采用逐位映射的方式得到字符的字模編碼Example特點易于定義顯示空間需求量大100xFC0x660x660x7C0x660x660xFC0x003.6.1點陣字符
在點陣表示中,每個字符由一個點陣位圖來表示。顯示時:形成字符的象素圖案字符A的點陣表示111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000(a)字符A的點陣位圖(a)字符A的象素圖案Def.-將字符筆畫分解為線段,以線段端點坐標為字符字模的編碼.3.6.2矢量字符012345670123456700505061616262535364646565565606101620262353012345670123456700505061616262535364646565565606101620262353特點
空間需求量小時間開銷大Example矢量字符采用直線和曲線段來描述字符形狀,矢量字符庫中記錄的是筆劃信息。具有存儲空間小,美觀、變換方便等優(yōu)點。對于字符的旋轉、縮放等變換,顯示時首先從字庫中將它的字符信息取出,然后取出端點坐標,對其進行適當?shù)膸缀巫儞Q,再根據(jù)各端點的標志顯示出字符。特點:點陣字符:存儲量大,易于顯示矢量字符:存儲量小,美觀,變換方便;但需要光柵化后才能顯示。點陣字符點陣字庫中的位圖表示矢量輪廓字符總結研究內(nèi)容直線的掃描轉換圓的掃描轉換橢圓的掃描轉換多邊形的掃描轉換與區(qū)域填充裁剪字符的處理屬性處理反走樣DDA畫線法中點畫線法Bresenham畫線法中點畫圓法Bresenham畫圓法中點畫橢圓法掃描線多邊形填充算法邊緣填充算法邊緣填充算法柵欄填充算法邊標志算法邊界填充算法泛填充算法掃描線填充遞歸填充Cohen-Sutherland算法中點分割算法Liang-Barsky算法Cyrus-Beck算法Nicholl-Lee-Nicholl算法Sutherland-Hodgeman多邊形裁剪算法Weiler-Atherton多邊形裁剪算法直線段多邊形文字3.7
屬性處理3.7.1
線型和線寬1.線型處理LineType線型Howto?繪制像素段Pixelmask像素掩碼eg.1111000Problem
根據(jù)直線斜率調(diào)整實心段和空白段的像素數(shù)目解決:可根據(jù)線的斜率來調(diào)整實心段和中間空白段的象素數(shù)目。xy213456789111234567891011121012a相同數(shù)目象素顯示的不等長劃線b2線寬處理LineWidthHowto?
顯示相鄰平行線段類型
(1)水平或垂直方向擴展
(2)矩形區(qū)域填充
(3)畫筆或畫刷|m|<1(x,y)&(x,y+1)|m|>1(x,y)&(x+1,y)&(x-1,y)&(x-2,y)特點實現(xiàn)簡單、效率高。斜線與水平(或垂直)線不一樣粗。當線寬為偶數(shù)個象素時,線的中心將偏移半個象素。利用線刷子生成線的始末端總是水平或垂直的,看起來不太自然。解決:添加“線帽(linecap)”線“帽子”(a)方帽(c)圓帽(b)突方帽調(diào)整平行線的端點位置,使粗線顯示具有垂直于線路徑的方端線段向兩頭延伸一半線寬并添加方帽子方帽兩端添加填充的半圓其他線寬處理方式(畫筆和畫刷)Shape形狀Size尺寸Pattern樣式PixelMask3.LineColor4.曲線的線型和線寬Pixelmaskseg.11100根據(jù)曲線斜率設置像素掩碼的實心段和空白段像素數(shù)目Curvewidth
水平(|m|>1)或垂直(|m|<1)像素段Pen&BrushoptionsEg.Rectangularpen3x3字體 宋體仿宋體
楷體
黑體隸書字高宋體
宋體宋體宋體宋體字寬字傾斜角 傾斜傾斜對齊(左對齊、中心對齊、右對齊)字色紅色、綠色、藍色……3.7.2字符的屬性3.7.3
區(qū)域填充屬性區(qū)域填充屬性選擇包括顏色、圖案和透明度。001010111(a)圖案模板位圖(b)用該模板進行填充
利用圖案模板進行三角形的填充模板圖案根據(jù)圖案和透明度屬性來填充平面區(qū)域的基本思想是:首先用模板定義各種圖案。然后,修改填充的掃描轉換算法:在確定了區(qū)域內(nèi)一象素之后,不是馬上往該象素填色而是先查詢模板位圖的對應位置。若是以透明方式填充圖案,則當模
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年北師大版四年級英語下冊月考試卷含答案
- 2025至2031年中國原汁獼猴桃女人酒行業(yè)投資前景及策略咨詢研究報告
- 2024年華師大新版選修3物理上冊階段測試試卷含答案
- 2025年人教A版九年級生物上冊月考試卷含答案
- 2025至2031年中國前門玻璃底部托槽組件行業(yè)投資前景及策略咨詢研究報告
- 2025年教科新版選擇性必修2物理下冊月考試卷含答案
- 糧食收購運輸合同樣本
- 2025至2030年中國里程表手柄數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國語音劍數(shù)據(jù)監(jiān)測研究報告
- 2025年岳麓版七年級地理下冊階段測試試卷含答案
- 三年級上冊科學說課課件-1.5 水能溶解多少物質|教科版
- GB/T 7588.2-2020電梯制造與安裝安全規(guī)范第2部分:電梯部件的設計原則、計算和檢驗
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- 小學道德與法治學科高級(一級)教師職稱考試試題(有答案)
- 申請使用物業(yè)專項維修資金征求業(yè)主意見表
- 河北省承德市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細
- 實用性閱讀與交流任務群設計思路與教學建議
- 應急柜檢查表
- 通風設施標準
- 酒店市場營銷教案
- 房屋買賣合同簡單范本 房屋買賣合同簡易范本
評論
0/150
提交評論