2008-12-22 11 views
6

Avast y a d'autres programmeurs!Opérations booléennes sur les polygones rectangle

J'ai le problème suivant:

J'ai deux rectangles qui se chevauchent, comme indiqué sur l'image ci-dessous.

alt text

Je veux comprendre le polygone constitué du point ABCDEF.

Autre description de Noël: Le coupe-biscuits rouge coupe un peu le biscuit noir. Je veux calculer le cookie noir.

Chaque rectangle est une structure de données avec 4 sommets 2d.

Quel est le meilleur algorithme pour y parvenir?

+0

Les polygones sont-ils toujours alignés selon les axes? –

Répondre

5

Ceci est un cas particulier de découpage de polygones 2D général. Un bon point de départ est l'algorithme de Weiler-Atherton. Wikipedia has a summary et links to the original paper. L'algorithme semble correspondre assez bien à la structure de données que vous avez décrite. Notez qu'il est tout à fait possible que vous vous retrouviez avec un rectangle avec un trou dedans (si le rouge est entièrement à l'intérieur du noir) ou même deux rectangles (par exemple si le rouge est plus grand et plus maigre que le noir). Si vous êtes certain qu'il n'y a qu'un coin du rectangle rouge à l'intérieur du noir, alors la solution devrait être beaucoup plus simple.

+0

Le rectangle rouge peut être n'importe où sur le noir. Cependant, s'il se chevauche, je néglige tout simplement le rectangle noir, car il a une priorité moindre. – Nailer

+0

On dirait que ce dont j'avais vraiment besoin. – Nailer

+0

http://en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithm semble encore mieux expliqué. – Nailer

2

Quelle est la précision des coordonnées? Si les rectangles sont assez petits, l'approche la plus simple pourrait être de les peindre sur une toile, d'abord en rectangle noir, puis en rouge. Les pixels noirs restants sur la toile sont le polygone qui reste. Une autre approche consiste à diviser la grille de coordonnées en un groupe de rectangles basés sur tous les côtés des rectangles (sans compter les rectangles non bornés, vous avez jusqu'à 9 rectangles générés si vous avez deux rectangles d'origine). Il suffit ensuite de tester un point représentatif de chacun de ces rectangles pour l'appartenance aux polygones particuliers afin de déterminer quels rectangles sont entrés et lesquels sont absents.

+0

+1 pour la séparation en 9 pièces d'approche. C'est le plus simple et le plus rapide. –

+0

Juste une note explicative: "Peignez-les sur une toile" peut se faire de deux façons: soit sur une toile à partir d'une API graphique, soit sur un simple tableau 2D – Yuliy