2D-Begrenzungsbox eines Sektors?

8

Ich habe gegoogelt, bis ich blau im Gesicht bin, und wenn ich etwas wirklich Offensichtliches nicht vermisse, kann ich keine Algorithmen finden, um die Begrenzungsbox eines 2D Sektors zu berechnen.

Was ist der beste Algorithmus zur Berechnung des achsausgerichteten Begrenzungsrechtecks ​​dieses Sektors, wenn der Mittelpunkt des umschließenden Kreises, der Radius und die Winkel der Ausdehnung des Sektors angegeben werden?

    
Steve Folly 26.08.2009, 18:34
quelle

3 Antworten

15
  • Erzeugen Sie die folgenden Punkte:
    • Die Mitte des Kreises
    • Die Positionen der zwei Radien auf dem Kreis
    • Die Punkte auf dem Kreis für jeden Winkel zwischen den beiden, der durch 90 o (maximal 4 Punkte)
    • dividiert
  • Berechnen Sie das Minimum und Maximum x und y von den oben genannten Punkten. Dies ist Ihre Bounding-Box
yairchu 26.08.2009, 18:48
quelle
8

Ich werde Yairchus Antwort so umformulieren, dass sie klarer ist (für mich jedenfalls).

Ignoriere jetzt die Mittelpunktkoordinaten und zeichne den Kreis am Ursprung. Überzeuge dich selbst von folgendem:

  1. Überall, wo der Bogen eine Achse schneidet, wird ein Maximum oder ein Minimum sein.
  2. Wenn der Bogen keine Achse schneidet, dann ist der Mittelpunkt eine Ecke des Begrenzungsrechtecks, und dies ist der einzige Fall, in dem es sein wird.
  3. Die einzigen anderen möglichen Extrempunkte des Sektors sind die Endpunkte der Radien.

Sie haben jetzt höchstens 4 + 1 + 2 Punkte zu finden. Finde die Max und Min dieser Koordinaten, um das Rechteck zu zeichnen.

Das Rechteck wird leicht in den ursprünglichen Kreis übersetzt, indem die Koordinaten des Mittelpunkts des ursprünglichen Kreises zu den Koordinaten des Rechtecks ​​hinzugefügt werden.

    
Glenn 26.08.2009 19:43
quelle
2

Zuerst entschuldige ich mich, wenn ich Fehler beim Schreiben begehe, aber Englisch ist nicht meine Muttersprache, Spanisch ist eigentlich!

Ich habe mich diesem Problem gestellt und denke, dass ich eine effiziente Lösung gefunden habe.

Sehen wir uns zuerst ein Bild der Situation an

Also haben wir eine Ellipse (eigentlich ein Kreis) und zwei Punkte ( C , D ), die unseren Sektor angeben. Wir haben auch die Mitte unseres Kreises ( B ) und den Winkel des Arc alpha .

Nun, in diesem Fall habe ich es durch 360º auf porpouse laufen lassen, um zu sehen, ob es funktioniert.

Sagen wir alpha -> -251.1º (negative Ursache im Uhrzeigersinn), transformiere sie in positiven Wert 360º - 251.1º = 108.9º Jetzt ist unser Ziel, den Winkel der Halbierung dieses Winkels zu finden, damit wir den maximalen Punkt für die Begrenzungsbox finden können ( E im Bild), wie Sie vielleicht bemerkt haben, ist die Länge des Segments BE gleich dem Radius des Kreises, aber wir müssen den Winkel haben, um die tatsächlichen Koordinaten des E Punktes zu erhalten.

Also 108.9º / 2 -> 54.45º Jetzt haben wir den Winkel.

Um die Koordinaten von E zu finden, verwenden wir Polarkoordinaten, also

%Vor%

wir haben r und theta , damit wir x und y berechnen können

in meinem Beispiel r = 2.82 ... (eigentlich ist es irational, aber ich habe die ersten zwei Dezimalziffern als eine Leichtigkeit genommen)

Wir wissen, dass unsere ersten Radien 87.1º sind, also wäre Theta 87.1 - 54.45º -> 32.65º

wir wissen * Theta * ist 32.65º , also machen wir etwas Mathe

%Vor%

Nun müssen wir diese Werte an die tatsächliche Mitte des Kreises anpassen, also

%Vor%

Im Beispiel ist der Kreis um (1.86, 4.24)

zentriert %Vor%

In diesem Stadium sollten wir etwas Kalkül verwenden. Wir wissen, dass eine der Kanten der Begrenzungsbox eine Tangente des Bogens sein wird, der durch den Punkt verläuft, den wir gerade berechnet haben. Lassen Sie uns diese Tangente (die rote Linie) finden.

Wir wissen, dass die Tangente durch unseren Punkt (4.23, 5.76) geht, jetzt brauchen wir eine Steigung.

Wie Sie sehen können, ist die Steigung die gleiche wie die Steigung der Rect, die durch unsere Radien verläuft, also müssen wir diese Steigung finden.

Dafür müssen wir die Koordinaten unserer Radien erhalten (eine schnelle Umwandlung in kartesische Koordinaten aus Polarkoordinaten).

%Vor%

Also

%Vor%

( 21.8º ist der Winkel, der im Uhrzeigersinn von der horizontalen Achse zu den Radien gemessen wird, die darunter liegen, und daher setze ich ihn negativ)

%Vor%

Lasst uns jetzt die Steigung finden:

%Vor%

mit der Steigung, die wir benötigen, um die Gleichung für den Tangens zu berechnen, ist im Grunde ein Rect mit einer bereits bekannten Steigung ( m = -1.56 ), die durch einen bereits bekannten Punkt ( E -> (4.23, 5.76) )

geht

Wir haben also Y = mx + b wo m = -1.56 , y = 5.76 und x = 4.23 so b muss

sein %Vor%

Jetzt haben wir die vollständige Gleichung für unsere Tangente - & gt; %Code% Alles, was wir wissen müssen, ist, die Punkte Y = -1.56X + 12.36 und C über dieses Rechteck zu projizieren.

Wir brauchen die Gleichungen für die rects D und CH , also lasst uns 'em

berechnen

Beginnen wir mit DI :

Wir wissen (aus der tanget-Gleichung), dass unser Richtungsvektor CH

ist

Wir müssen ein Rechteck finden, das durch den Punkt (1.56, 1)

geht %Vor%

Etwas Algebra machen - & gt; C -> (2, 7.06)

Wir wissen, dass wir die Gleichung für das rect y = 0.64x + 5.78 haben müssen wir den Punkt CH berechnen.

Wir müssen ein lineares System wie folgt lösen

%Vor%

Wenn wir das lösen, finden wir den Punkt H

Wir müssen dasselbe mit dem rect H (3, 7.69) machen, also machen wir es

Unser Richtungsvektor ist wieder DI

%Vor%

Etwas Algebra machen - & gt; (1.56, 1)

Lässt das lineare System lösen

%Vor%

In diesem Stadium haben wir bereits die vier Punkte, die unsere Bounding-Box bilden - & gt; y = 0.64x + 0.32

Nur für den Fall, dass Sie nicht wissen oder sich erinnern, wie Sie ein lineares System in einer Programmiersprache lösen können, gebe ich Ihnen ein kleines Beispiel

Es ist reine Algebra

Nehmen wir an, wir haben das folgende System

%Vor%

dann

%Vor%

ersetzt die andere Gleichung

%Vor%

so

%Vor%

und für C, H, D , I machen wir dasselbe

%Vor%

ersetzt die andere Gleichung

%Vor%

Ich entschuldige mich für das Ausmaß meiner Antwort, aber ich wollte so klar wie möglich sein und so habe ich es fast Schritt für Schritt geschafft.

    
Manusoftar 11.02.2013 23:15
quelle

Tags und Links