第三章 左下靠緊板面規劃之輪廓管理:
3.3 階層式階梯輪廓的基本運算
本節將介紹如何去使用上一節提到的階梯式輪廓,儲存階梯式輪廓的目標即
希望板面規劃能隨時保持左下緊密的狀態,所以對階梯式輪廓的操作即如何讓一 還未放置的區塊放入以階梯式輪廓儲存的板面規劃中,並且使得其成左下緊密的 狀態,最後還要讓區塊融入階梯式輪廓的資料結構裡。假設有一個新的區塊要加 入階梯式輪廓結構裡,需要經過以下三個步驟 :
步驟 1 : 由上而下階層式地找尋定位的 L 角落:
利用階梯式輪廓內父子階梯的關係,由上到下的去搜尋每層的階 梯,首先第一層如圖 3.9(a)起點為 L 終點為 B,串列的階梯為<L→1→3
→B>,有 3 個 L 角落分別為<L→1>、<1→3>與<3→B>,假設若再選擇<1
→3>這個 L 角落則可發現其中起點 1 終點 3 含有子輪廓<1→2→3>,此 為第二層如圖 3.9(b),第二層有<1→2>與<2→3>兩個 L 角落可以選擇,
其中<2→3>為旋轉 90 度的 L 角落不能選擇,最後則選擇<1→2>的 L 角 落,這個過程即是由上而下(Top-down)搜尋的方式,在實際上演算法可 以用遞迴程式法實作。
1
2
3 L
B 1
2
3 L
B
1
2
3 B
L 1
2
3 B
L
1
2
3 L
B 1
2
3 L
B
1
2
3 B
L 1
2
3 B
L
(a) 第一層階梯輪廓<L→1→3→B> (b)第二層階梯輪廓<1→2→3>
圖 3.9 由上而下階層式地找尋定位的 L 角落
延續上依步驟,在階梯式輪廓裡的各個 L 角落總共可分成兩種,其 一為直實 L 角落(real L -corner),表這個 L 角落沒有包含子階梯輪廓 在其中,如圖 3.9(a)中<1→2>即為此類;另一為虛擬 L 角落,即其中包 含有一子階梯輪廓在其中,如圖 3.9(b)的<1→3>屬於此種。
當由上而下階層式搜尋階梯時,要可以一直階層搜尋條件為區塊在 虛擬 L 角落且可以滑進子階梯,如圖 3.9(a)到圖 3.9 (b)一般。相反地,
停止搜尋且定位區塊的位置則有兩種情況,第一種為區塊停在真實 L 角落如圖 3.10(a)所示;而另一情況為區塊雖停在虛擬 L 角落上卻無法 進入子階梯中,如圖 3.10(b)一般,新進的區塊無法再往左往下移動,
在實際實作時只要依照階梯凹陷型態即可判斷,下方凹陷即判斷區塊的 寬和造成虛擬 L 角落的兩區塊間水平距離即可,如圖 3.10(b),其餘型 態皆與此類似,左方凹陷判斷區塊的高和區塊間的垂直距離,左下凹陷 則水平垂直與區塊寬高皆考慮。
1
2 3 4
1 2 4 B
L 1
2 3
L B
1
2
3 1
2
3
(a)區塊在真實 L 角落上 (b)區塊在虛擬角落上且無法 往下往左移動
圖 3.10 區塊定位的條件
步驟 3 :由下而上階層式地更新階梯式輪廓結構
基本上更新階梯式輪廓的順序,與搜尋 L 角落的順序相反,但也是 階層式的方法,為了簡單起見先分成單層輪廓與多層輪廓更新,其中
多層為單層的延伸,在此先說明單層更新的步驟。
單層階梯式輪廓更新: 當一新的區塊在單層的階梯定位後,可分為 四種情形;其一,區塊定位後,不會產生任何凹陷的情況,如圖 3.11(a);
其次,區塊定位後會產生一左方凹陷的情況,如圖 3.11(b);另一,區 塊定位後會產生下方凹陷的情況,如圖 3.11(c);最後一種為區塊定位 後,產生一左凹和一右凹陷的情況,如圖 3.11(d)。
(c) (d)
圖 3.11 新區塊放入單層階梯輪廓的情形
以上這四種情形更新的步驟接相同,這邊取最具代表的情況四做為 範例,假設一區塊 N 要放入一單層階梯式輪廓中且其為第四種情況時,
如圖 3.12(a),則這個單層階梯式輪廓更新的步驟如下:
步驟 1 : 找出這個單層階梯輪廓的起始點與終點 :
即確定這一層的起終點,如圖 3.12(a)的起點為 L 終點為 B。
步驟 2 : 確定哪些本來在輪廓上的區塊要改變指向新進區塊 N:
有兩種區塊會指向新進區塊 N:其一,與新進區塊 N 左邊相鄰 的區塊要改指向新進區塊 N,如圖 3.12(b)的區塊 2 會指向 N;其
(a) (b)
始對階梯輪廓作追蹤直到接觸到停止線,接觸到停止線的區塊即需 增加一個連接邊指向區塊 N,如圖 3.12(b)由區塊 N 造出停止線,
然後從 L 點開始追蹤找到停止線在區塊 1,則區塊 1 建造指向 N 的 連接邊。
步驟 3 : 確定新進區塊 N 要指向的區塊:
與步驟二類似,新進區塊 N 需指向的區塊也有兩類: 其一,新 進區塊 N 需指向與其下邊相鄰的區塊,如圖 3.12(c)的區塊 N 會指 向區塊 3;其次,則是先由新進區塊 N 的右邊垂直畫一條停止線,
然後由與區塊 N 下邊相鄰的區塊開始對階梯輪廓作追蹤直到接觸 到停止線,區塊 N 需增加一條連接邊指向接觸到停止線的區塊,如 圖 3.12(c)由區塊 N 造出停止線,然後從區塊 3 點開始追蹤找到停 止線在 B,則區塊 N 建造指向 B 的連接邊。
0 1
2 3
N
4 L
B
L 1 2 3 4 B
N 0
0 1
2 3
N
4 L
B
L 1 2 3 4 B
N 0
0 1
2 3
N
4 L
B
L 1 2 3 4 B
N 0 0
1 2
3
N
4 L
B
L 1 2 3 4 B
N 0
0 1
2 3
N
4 L
B
L 1 2 3 4 B
N 0
0 1
2 3
N
4 L
B
L 1 2 3 4 B
N 0
(a) 步驟 1:起點為 L,終點為 B (b)步驟 2:指向 N 的區塊
4 3 2 0
1
N L
B
L 1 2 3 4 B
New 0
0 1
2 3
N
4 L
B
L 1
2 3 4
B New
0
4 3 2 0
1
N L
B
L 1 2 3 4 B
New 0
4 3 2 0
1
N L
B
L 1 2 3 4 B
New 0
0 1
2 3
N
4 L
B
L 1
2 3 4
B New
0
0 1
2 3
N
4 L
B
L 1
2 3 4
B New
0
(c)步驟 3:N 指向的區塊 (d)完成更新 圖 3.12 單層階梯式輪廓更新
圖 3.12(d)表示完成加入區塊 N 後,單層階梯式輪廓的情形,可以 發現區塊 N 產生了兩個凹陷而出現了兩個子輪廓分別是,<0→1→2→N>
與<N→3→4→8>,其他區塊放入情形也類似只是由區塊畫出的停止線不 同,產生出的凹陷子輪廓不同而已。
接下來說明當區塊放入多層的階梯式輪廓時的更新,由於是多層所 以需各別各層做更新,更新的順序與搜尋 L 角落的順序相反,針對各層 有 3 個步驟:
步驟 1 : 確認這一層的起點與終點。
步驟 2 : 若為最內層,則以不超過最內層為原則,先對最內層為 準做單層更新。
步驟 3 : 由起點和終點判定新進區塊在這層的狀況,若新進區塊 超越這層則將這層分割且回溯父階梯輪廓到到步驟 1;若狀況為新進區 塊無超越此層,則把新進區塊在這層的部份分割出來,然後以這部份在 這層做單層的輪廓更新。以圖 3.13 為例,一新進區塊 N 放入多層階梯 式輪廓的內層如圖 3.13(a)所示。在更新的時候,層與層的順序與放入 時顛倒,所以更新的第一層為放入的最後一層。
更新的第一層為子階梯輪廓<0→1→2→3>,如圖 3.13(b)所示,確 定階梯輪廓層級後實行上述的步驟,首先確認此層階梯輪廓起始為 0 終點為 3;其次第二步由於此層為最內層,需對針此層做單層的更新,
新進區塊在此層有如單層的狀況 2(圖 3.13(b)所示),只是由於限於在 此層更新所以無法找到 L 與區塊 N 做連結,更新後得到區塊 1 連接到 N 與區塊 N 連接到 2 的連接線;接下來為第三步驟,可以由作為起終點的
和到區塊 3 的連接邊打斷,然後由區塊 N 連結到區塊 3,本來<0→1→2
→3>的階梯輪廓被切割為<未知→0→1→N>與<N→2→3>其中有「未知」
是因在這層還找到,由於區塊超過這層所以需繼續往父層更新。
更新的第二層為最外層<L→0→3→B>,如圖 3.13(c)所示,其中<0
→3>已被打斷,但由於需使整層完整易於實作,所以假設還存在; 確定 階梯輪廓層級後執行上述的三步驟,首先確認此層階梯輪廓起始為 L 終點為 B;其次由與本層不為最內層,所以不執行; 接下來第三步驟,
可以由作為起終點的 L 和 B 發現此層為最外層,任何區塊應都在最外層 之內,應此判定區塊無超越此層級,如此須把新進區塊在這層的部份分 割出來,然後以這部份在這層做單層的輪廓更新,即將區塊 N 分成如圖 3.13(c)一樣,然後把斜線部份再這一層級作單層的更新,結果可以使 L 產生一新連接邊連向區塊 N,而區塊 N 會指向區塊 3,最後由於區塊 無超越此層則更新結束,圖 3.13(d)展示最後更新的結果。
從最後更新結果(圖 3.13(d)所示)可看出整個多層輪廓的變化,被 區塊 N 橫跨的層級,就像是被切成了兩半一樣,在圖 3.13(a)中原本函 在<0→3>內的子階梯輪廓<0→1→2→3>被區塊 N 切成了<0→1→N>和<N
→2→3>,<0→3>也被<0→N→3>取代掉。由此可知,多層階梯輪廓的更 新就是把舊的階梯輪廓作分割,被超越的層級就會被切割,而沒被超越 的層級除剛好新的區塊還在之中的以外皆不會改變。
L
B 0
3 2
1
N
0 3 B
1 2
N L
L
B 0
3 2
1
N L
B 0
3 2
1
N
0 3 B
1 2
N
L 0 3 B
1 2
N L
N
0
3 2
1 L
B
0 3 B
1 2 N
L
N
0
3 2
1 L
B N
0
3 2
1 L
B
0 3 B
1 2 N
L
(a)新進區塊 N 放入多層輪廓 (b)新進區塊超越內部 第一層<0→1→2→3>
0 3 B
1 2
N L
0
3 2
1
N L
B
0 3 B
1 2
N
L 0 3 B
1 2
N L
0
3 2
1
N L
B 0
3 2
1
N L
B
0
3 2
1 N L
B B 0
3 B
1 2
N L
0
3 2
1 N L
B 0
3 2
1 N L
B B 0
3 B
1 2
N L
0
3 B
1 2
N L
(c)新進區塊在外層<L→0→3>以內 (d)完成更新 如圖 3.13 多層階梯式輪廓更新
以上三步驟即當一區塊放入階梯式輪廓時所做的步驟,由於為階層式且相當 有規律性,所以本論文以遞迴式的演算法來實作,如圖 3.14,其中參數 Block 表示要放入的區塊,以程序來說,第一個層級一定是從 L 到 B 開始,先是找在層 級中適合的 L 角落,若定位的 L 角落可使 Block 定位則停止,若不行則以此 L 角落為新層級的起終點遞迴代入函式再找。區塊定位好了後,開始更新輪廓,由 於順序剛好與找定位相反所以剛好在遞迴時回傳的時候執行,先檢查 Block 是否
圖 3.14 在階層階梯式輪廓中放入區塊的演算法