跳转到主要内容
模糊矩形是一种结构,用来描述其边界位于特定允许范围内的一类矩形。一个模糊矩形由两个矩形组成——一个外部矩形和一个内部矩形。 在 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 的右边界与另一个 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]。通常,空的模糊矩形是由相互矛盾的条件导致的,例如尝试对两个外边界互不相交的模糊矩形求交时。 模糊矩形的合并方式相同:首先,分别合并每个边界的范围。通过合并两个范围,会得到一个同时包含这两个指定范围的最小范围。边界合并之后,会形成一个新的模糊矩形。 在实践中,最常见的是内部矩形退化的模糊矩形。只有在极少数情况下,才需要对某个特定边界设置约束条件。然而,元素的搜索区域始终由一个模糊矩形和一个排除矩形数组来表示。