跳轉到主要內容
模糊矩形 是一種結構,用於描述其邊界位於特定允許範圍內的一組矩形。模糊矩形由兩個矩形組成——外部矩形與內部矩形。 在 FlexiLayout 語言中,模糊矩形以類型 FuzzyRect 表示。 如下面的圖所示,在一般情況下,當所有邊界條件都已設定時,搜尋區域中會有一部分必須落在該元素的任一假設之內,也正是這一部分構成了內部矩形。而所有可能假設的最大外接矩形則構成外部矩形。 顯示內部與外部矩形的矩形示意圖 假設元素的邊界為:
LeftBound: [L1, L2], where L1 <= L2
TopBound: [T1, T2], where T1 <= T2
RightBound: [R1, R2], where R1 <= R2
BottomBound: [B1, B2], where B1 <= B2
然後,包含指定邊界資訊的模糊矩形將按下列方式構成:InternalRect: [L2, T2, R1, B1], ExternalRect: [L1, T1, R2, B2] 如果使用者未對搜尋區域的邊界設定任何限制,則內部矩形會退化而失去幾何意義。在此情況下 L1=R1, L2=R2, T1=B1, T2=B2 現在假設尚未為搜尋區域指定任何限制。那麼,如果允許的最大與最小頁面數皆為 1,則搜尋區域的模糊矩形將按如下方式建立:
LeftBound: [PageRect.Left, PageRect.Right]
TopBound: [PageRect.Top, PageRect.Bottom]
RightBound: [PageRect.Left, PageRect.Right]
BottomBound: [PageRect.Top, PageRect.Bottom]
InternalRect: [PageRect.Right, PageRect.Bottom, PageRect.Left, PageRect.Top]
ExternalRect: [PageRect.Left, PageRect.Top, PageRect.Right, PageRect.Bottom]
而在多頁文件的情況下:
LeftBound: [-INF, INF]
TopBound: [-INF, INF]
RightBound: [-INF, INF]
BottomBound: [-INF, INF]
InternalRect: [INF, INF, -INF, -INF]
ExternalRect: [-INF, -INF, INF, INF]
從上述表達式可以看出,外部矩形與整個頁面的矩形重合,而內部矩形則退化,其高度和寬度為負值。

對模糊 Rectangle 的運算

模糊 Rectangle 可以進行聯集與交集運算。當兩個模糊 Rectangle 做交集時,其對應邊界會彼此相交:一個 Rectangle 的右邊界與另一個的右邊界相交,左邊界與左邊界相交,依此類推。這會得到這些邊界的新範圍:
LeftBound: [L1', L2']
TopBound: [T1', T2']
RightBound: [R1', R2']
BottomBound: [B1', B2']
最終得到的模糊矩形將使用計算得到的區間來建立:InternalRect: [L2’, T2’, R1’, B1’],ExternalRect: [L1’, T1’, R2’, B2’]。 如果在交集運算後,用於建立模糊矩形的條件 (L1 <= L2, T1 <= T2, R1 <= R2, B1 <= B2) 至少有一項不滿足,則最終得到的模糊矩形將被設為空:InternalRect: [0, 0, 0, 0],ExternalRect: [0, 0, 0, 0]。通常,空的模糊矩形是由互相矛盾的條件產生的,例如嘗試對兩個外邊界互不相交的模糊矩形求交集時。 模糊矩形的聯集運算方式相同:首先合併每個邊界的區間。透過合併兩個區間,會產生一個同時包含這兩個指定區間的最小區間。當邊界完成合併後,就形成一個新的模糊矩形。 在實務中,最常見的是具有退化的內部矩形的模糊矩形。只有在少數情況下,才需要對某個特定邊界設定限制。然而,元素的搜尋區域一律由一個模糊矩形以及一個排除 Rectangle 的陣列來表示。