2008-12-22 13 views
6

Avast dort Kollegen Programmierer!Boolesche Operationen auf Rechteckpolygonen

Ich habe folgendes Problem:

Ich habe zwei Rechtecke überlappen, wie unten auf dem Bild gezeigt.

alt text

Ich möchte das Polygon, um herauszufinden, von Punkt ABCDEF aus.

Alternative Weihnachtsbeschreibung: Der rote Ausstecher schneidet etwas vom schwarzen Keks ab. Ich möchte den schwarzen Keks berechnen.

Jedes Rechteck ist eine Datenstruktur mit 4 2d-Vertices.

Was ist der beste Algorithmus, um dies zu erreichen?

+0

Sind die Polygone immer wie gezeigt achsausgerichtet? –

Antwort

5

Dies ist ein Spezialfall des allgemeinen 2D-Polygon Clipping. Ein guter Ausgangspunkt ist der Weiler-Atherton-Algorithmus. Wikipedia has a summary und links to the original paper. Der Algorithmus scheint mit der von Ihnen beschriebenen Datenstruktur übereinzustimmen.

Beachten Sie, dass es sehr wahrscheinlich ist, dass Sie ein Rechteck mit einem Loch (wenn das rote vollständig innerhalb des schwarzen ist) oder sogar zwei Rechtecken (z. B. wenn das Rot größer und dünner als das Schwarz ist). Wenn Sie sicher sind, dass nur eine Ecke des roten Rechtecks ​​in der schwarzen liegt, sollte die Lösung viel einfacher sein.

+0

Das rote Rechteck kann überall auf dem Schwarz sein. Wenn es jedoch überlappt, ignoriere ich einfach das schwarze Rechteck, da es eine niedrigere Priorität hat. – Nailer

+0

Scheint genau das, was ich wirklich brauchte. – Nailer

+0

http://en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithmus scheint noch besser erklärt. – Nailer

2

Wie genau sind die Koordinaten? Wenn die Rechtecke ziemlich klein sind, ist es am einfachsten, sie einfach auf eine Leinwand zu malen, zuerst ein schwarzes Rechteck, dann ein rotes. Die verbleibenden schwarzen Pixel auf der Leinwand sind das übrig gebliebene Polygon. Ein anderer Ansatz besteht darin, das Koordinatengitter in eine Reihe von Rechtecken zu zerlegen, die auf allen Seiten der Rechtecke basieren (ohne ungebundene Rechtecke, bis zu 9 Rechtecke, wenn Sie zwei ursprüngliche Rechtecke haben). Dann teste einfach einen repräsentativen Punkt von jedem dieser Rechtecke auf Zugehörigkeit zu den bestimmten Polygonen, um zu bestimmen, welche Rechtecke innen und welche außen sind.

+0

+1 für die Aufteilung in 9 Stück Ansatz. Das ist das Einfachste und Schnellste. –

+0

Nur eine klärende Anmerkung: "Malen Sie sie auf einer Leinwand" kann auf zwei Arten erfolgen: entweder auf eine Leinwand von einer Grafik-API oder auf ein einfaches 2-D-Array – Yuliy