Passer au contenu principal
Un rectangle flou est une structure qui décrit une classe de rectangles dont les limites se trouvent dans des plages autorisées données. Un rectangle flou se compose de deux rectangles : un rectangle externe et un rectangle interne. Dans le langage FlexiLayout, les rectangles flous sont représentés par le type FuzzyRect. Comme on peut le voir dans la figure ci-dessous, dans le cas général, lorsque des contraintes sont définies pour toutes les limites, il existe une partie de la zone de recherche qui doit appartenir à toute hypothèse de l’élément. C’est cette partie qui forme le rectangle interne. Le plus grand rectangle circonscrit de l’hypothèse possible forme le rectangle externe.
Soient les limites de l’élément : LeftBound: [L1, L2], où L1 <= L2 TopBound: [T1, T2], où T1 <= T2 RightBound: [R1, R2], où R1 <= R2 BottomBound: [B1, B2], où B1 <= B2 Alors, le rectangle flou contenant les informations sur les limites spécifiées sera formé comme suit : InternalRect: [L2, T2, R1, B1], ExternalRect: [L1, T1, R2, B2]. Si l’utilisateur ne définit aucune contrainte pour les limites de la zone de recherche, le rectangle interne dégénère et n’a plus de sens géométrique. Dans ce cas, L1=R1, L2=R2, T1=B1, T2=B2. Supposons maintenant qu’aucune contrainte n’ait été spécifiée pour la zone de recherche. Alors, si le nombre minimal et maximal de pages autorisé est de 1, le rectangle flou de la zone de recherche sera créé comme suit : 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] et dans le cas d’un document multipage : LeftBound: [-INF, INF] TopBound: [-INF, INF] RightBound: [-INF, INF] BottomBound: [-INF, INF] InternalRect: [INF, INF, -INF, -INF] ExternalRect: [-INF, -INF, INF, INF] Comme on peut le voir d’après les expressions ci-dessus, le rectangle externe coïncide avec le rectangle de la page entière, et le rectangle interne dégénère et présente une hauteur et une largeur négatives. Les rectangles flous peuvent être unis et intersectés. Lorsque deux rectangles flous sont intersectés, leurs limites correspondantes s’intersectent : la limite droite d’un rectangle s’intersecte avec la limite droite de l’autre, la gauche avec la gauche, etc. Cela crée de nouvelles plages pour les limites : LeftBound: [L1’, L2’] TopBound: [T1’, T2’] RightBound: [R1’, R2’] BottomBound: [B1’, B2’] Le rectangle flou résultant sera créé à l’aide des intervalles obtenus : InternalRect: [L2’, T2’, R1’, B1’], ExternalRect: [L1’, T1’, R2’, B2’]. Si, à la suite de l’intersection, au moins une des conditions de création du rectangle flou (L1 <= L2, T1 <= T2, R1 <= R2, B1 <= B2) n’est pas satisfaite, le rectangle flou résultant sera annulé : InternalRect: [0, 0, 0, 0], ExternalRect: [0, 0, 0, 0]. En règle générale, un rectangle flou vide résulte de conditions contradictoires, par exemple si vous essayez d’intersecter deux rectangles flous dont les limites externes ne s’intersectent pas. Les rectangles flous sont unis de la même manière : d’abord, les plages de chaque limite sont unies. L’union de deux plages produit une plage minimale qui contient les deux plages spécifiées. Une fois les limites unies, un nouveau rectangle flou est formé. En pratique, vous rencontrerez le plus souvent des rectangles flous avec un rectangle interne dégénéré. Vous n’aurez besoin de définir des contraintes sur une limite spécifique que dans de rares cas. Cependant, la zone de recherche d’un élément est toujours représentée par un rectangle flou et un tableau de rectangles exclus.