定義迂迴規則

Flash Player 10 以及更新的版本,Adobe AIR 1.5 以及更新的版本

增強的繪圖 API 還加入了路徑「迂迴」的概念:路徑的方向。路徑的迂迴可以是正向 (順時針) 或負向 (逆時針)。描繪器解譯座標 (由向量所提供,做為 data 參數) 的順序會決定迂迴。

正向和負向迂迴
正向和負向迂迴
A.
箭頭表示繪製的方向

B.
正向迂迴 (順時針)

C.
負向迂迴 (逆時針)

另外,請注意 Graphics.drawPath() 方法還有第三個選擇性參數,名為「winding」:

drawPath(commands:Vector.<int>, data:Vector.<Number>, winding:String = "evenOdd"):void

在本段內容中,第三個參數是字串或常數,可以指定交叉路徑的迂迴或填色規則 (這些常數值是在 GraphicsPathWinding 類別中定義為 GraphicsPathWinding.EVEN_ODDGraphicsPathWinding.NON_ZERO)。當路徑交叉時,迂迴規則便很重要。

奇偶規則是標準的迂迴規則,也是舊版繪圖 API 所使用的規則。此外,奇偶規則也是 Graphics.drawPath() 方法的預設規則。使用奇偶規則時,所有交叉的路徑都會交替使用開啟和結束填色。如果兩個使用相同填色繪製的正方形交集,交集區域會填色。一般而言,相鄰區域既不會兩者皆填色也不會兩者皆未填色。

另一方面,非零規則需視迂迴 (繪製方向) 來決定交叉路徑所定義的區域是否要填色。當具有相反迂迴的路徑交叉時,所定義的區域就不會填色,這和奇偶規則很像。如果是相同迂迴的路徑,則不會填色的區域便會填色:

交集區域的迂迴規則
交集區域的迂迴規則
A.
奇偶迂迴規則

B.
非零迂迴規則

迂迴規則名稱

名稱會用來表示更加特殊的規則,這個規則會定義管理這些填色的方式。對於正向迂迴路徑,所指定的值為 +1;而對於負向迂迴路徑,所指定的值則為 -1。從形狀中封閉區域的某一點開始,繪製一條向外無限延伸的線條。該線條與某一路徑交叉的次數以及這些路徑的合併值都會用於決定填色。對於奇偶迂迴而言,會使用該線條與某一路徑的交叉次數。當次數為奇數時,區域就會填色。當次數為偶數時,區域則不會填色。對於非零迂迴而言,則會使用指定給這些路徑的值。當路徑的合併值為 0 以外的數字時,區域就會填色。當合併值為 0 時,區域就不會填色。

迂迴規則次數與填色
迂迴規則次數與填色
A.
奇偶迂迴規則

B.
非零迂迴規則

使用迂迴規則

雖然這些填色規則相當複雜,但是在某些情況下是不可或缺的。例如,以繪製星形形狀為例。使用標準的奇偶規則時,需要十個不同的線段才能繪製這個形狀。而使用非零迂迴規則時,十條線則減少為五條。以下是使用五條線及非零迂迴規則繪製星形的 ActionScript:

graphics.beginFill(0x60A0FF); 
graphics.drawPath( Vector.<int>([1,2,2,2,2]),  Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]),   GraphicsPathWinding.NON_ZERO);

以下為星形形狀:

使用不同迂迴所繪製的星形形狀
使用不同迂迴所繪製的星形形狀
A.
使用奇偶規則,以 10 條線繪製

B.
使用奇偶規則,以 5 條線繪製

C.
使用非零規則,以 5 條線繪製

此外,當影像在製作成動畫或做為立體物件和重疊的紋理使用時,迂迴規則便亦顯重要。