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?
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:
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.
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
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)
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)
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)
)
Wir haben also Y = mx + b
wo m = -1.56
, y = 5.76
und x = 4.23
so b
muss
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
Beginnen wir mit DI
:
Wir wissen (aus der tanget-Gleichung), dass unser Richtungsvektor CH
Wir müssen ein Rechteck finden, das durch den Punkt (1.56, 1)
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
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
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.