跳转到主要内容
模糊矩形是一种结构,用于描述其边界位于特定允许范围内的一类矩形。模糊矩形由两个矩形组成——外部矩形和内部矩形。 在 FlexiLayout 语言中,模糊矩形由类型 FuzzyRect 表示。 如下图所示,在一般情况下,当为所有边界设置了约束时,搜索区域中有一部分必须包含在该元素的任何候选假设中。这部分构成内部矩形。而所有可能假设的最大尺寸外接矩形构成外部矩形。 Rectangle diagram showing internal and external rectangles 设该元素的边界为:
LeftBound: [L1, L2],其中 L1 <= L2
TopBound: [T1, T2],其中 T1 <= T2
RightBound: [R1, R2],其中 R1 <= R2
BottomBound: [B1, B2],其中 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]
对于多页 Document:
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 的右边界与另一个的右边界相交,左与左,依此类推。由此为这些边界产生新的取值范围:
左边界: [L1', L2']
上边界: [T1', T2']
右边界: [R1', R2']
下边界: [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]。通常,空的模糊矩形是由相互矛盾的条件导致的,例如尝试对两个外边界不相交的模糊矩形求交。 模糊矩形的并集以相同方式进行:首先合并每个边界的取值范围。合并两个范围后,会得到一个同时包含两个指定范围的最小范围。边界合并后,形成新的模糊矩形。 在实践中,最常见的是内部矩形退化的模糊矩形。只有在少数情况下才需要对某个具体边界设置约束。不过,元素的搜索区域始终由一个模糊矩形和一个被排除的矩形数组表示。