Wenn ich zwei Punkte eines Rechtecks ​​kenne, wie kann ich die anderen beiden herausfinden?

8

Hey Leute, ich lerne processing.js, und ich bin auf ein mathematisches Problem gestoßen, das ich mit meinen begrenzten Kenntnissen in Geometrie und Trigonometrie oder mit Hilfe von Wikipedia nicht lösen kann.

Ich muss ein Rechteck zeichnen. Um dieses Rechteck zu zeichnen, muss ich die Koordinatenpunkte jeder Ecke kennen. Alles, was ich weiß, ist x und y für die Mittelpunkte der Ober- und Unterseite der Box und die Länge aller vier Seiten.

Es gibt keine Garantie für die Ausrichtung der Box.

Irgendwelche Hilfe? Das scheint so, als ob es einfach sein sollte, aber es stampft mich wirklich.

    
icco 08.02.2010, 01:14
quelle

9 Antworten

8

Wenn dieses Viereck ein Rechteck ist (alle vier Winkel sind 90 Grad), dann kann es gelöst werden. (Wenn es ein Viereck sein könnte, dann ist es nicht lösbar)

Wenn die Punkte (x1, y1) und (x2, y2) sind, und wenn die beiden Punkte nicht perfekt vertikal (x1 = x2) oder horizontal (y1 = y2) sind, dann ist die Steigung einer Kante der Rechteck ist

%Vor%

und die Steigung der anderen Kante ist:

%Vor%

Wenn Sie die Längen der Seiten und die Mittelpunkte zweier gegenüberliegender Seiten kennen, können Sie die Korrnerpunkte leicht bestimmen, indem Sie dx, dy zu den Mittelpunkten hinzufügen: (wenn L die Länge der Seiten ist, auf denen die Mittelpunkte liegen)

%Vor%

und

%Vor%

HINWEIS: Wenn die Punkte vertikal oder horizontal ausgerichtet sind, funktioniert diese Technik nicht, obwohl die offensichtliche Lösung für diese degenerativen Fälle viel einfacher ist.

    
Charles Bretana 08.02.2010, 01:37
quelle
5

Wenn Sie wissen, dass Ihr Viereck ein Rechteck ist, können Sie einfache Vektormathematik verwenden, um die Koordinaten der Ecken zu finden. Die Bekannten sind:

  • (x1,y1) - die Koordinate des Mittelpunkts in der obersten Zeile
  • (x2,y2) - die Koordinate des Mittelpunkts in der unteren Zeile
  • l1 - die Länge der oberen und unteren Zeile
  • l2 - die Länge der anderen beiden Zeilen

Zuerst finden wir den Vektor zwischen den zwei bekannten Punkten. Dieser Vektor ist parallel zu den Seitenlinien:

(vx, vy) = (x2 - x1, y2 - y1)

Wir müssen diesen Vektor normalisieren (d. h., wir machen ihn zur Länge 1), damit wir ihn später als Grundlage für unsere Koordinaten verwenden können.

vlen = sqrt(vx*vx + vy*vy)

(v1x, v1y) = (vx / vlen, vy / vlen)

Als nächstes drehen wir diesen Vektor gegen den Uhrzeigersinn um 90 Grad. Der gedrehte Vektor wird parallel zur oberen und unteren Linie sein. Eine 90-Grad-Drehung stellt sich heraus, um nur die Koordinaten zu vertauschen und eine davon zu negieren. Sie können dies sehen, indem Sie es auf dem Papier ausprobieren. Oder werfen Sie einen Blick auf die Gleichungen für 2D-Rotationen und ersetzen Sie sie in 90 Grad.

(u1x, u1y) = (-v1y, v1x)

Jetzt haben wir genug Informationen, um die "obere linke Ecke" zu finden. Wir fangen einfach an unserem Punkt (x1, y1) an und bewegen uns entlang dieser Seite um die Hälfte der Seitenlänge zurück:

(p1x, p1y) = (x1 - u1x * l1 / 2, y1 - u1y * l1 / 2)

Von hier aus können wir die verbleibenden Punkte einfach durch Hinzufügen der entsprechenden Vielfachen unserer Basisvektoren finden. Wenn Sie dies implementieren, können Sie es natürlich beschleunigen, indem Sie jede einmalige Multiplikation nur einmal berechnen:

(p2x, p2y) = (p1x + u1x * l1, p1y + u1y * l1)

(p3x, p3y) = (p1x + v1x * l2, p1y + v1y * l2)

(p4x, p4y) = (p3x + u1x * l1, p3y + u1y * l1)

    
Dave 08.02.2010 02:22
quelle
2
%Vor%     
Saverio Mancuso 03.09.2016 18:11
quelle
0

Es ist definitiv ein Rechteck? Dann kennen Sie die Ausrichtung der kurzen Seiten (sie sind parallel zur Linie zwischen Ihren Punkten) und daher die Ausrichtung der langen Seiten.

Sie kennen die Ausrichtung und Länge der langen Seiten, und Sie kennen ihre Mittelpunkte, so dass Sie die Ecken von dort aus leicht finden können.

Die Implementierung bleibt dem Leser als Übung überlassen.

    
Anon. 08.02.2010 01:23
quelle
0

Dies bedeutet, dass zwei Linien parallel zu der Linie zwischen den zwei Punkten, die Sie haben, liegen. Holen Sie sich die Ecken, indem Sie die Linie um 1/2 der Länge der oberen Seite in jede Richtung senkrecht zu der Linie, die Sie haben, verschieben.

    
villintehaspam 08.02.2010 01:23
quelle
0

Wenn Sie den Mittelpunkt für die Spitze und die Länge der Spitze kennen, wissen Sie, dass das y für beide oberen Ecken gleich bleibt und das x der Mittelpunkt plus / minus der Breite des Rechtecks ​​ist. Dies gilt auch für den Boden.

Sobald Sie die vier Ecken haben, brauchen Sie sich keine Gedanken über die Seitenlängen zu machen, da ihre Punkte die gleichen sind wie für oben und unten.

%Vor%     
Anthony 08.02.2010 01:27
quelle
0

Es gibt einen Unterschied zwischen einem "Viereck" und einem "Rechteck".

Wenn Sie den Mittelpunkt der Ober- und Unterseite und die Seitenlängen haben, ist der Rest einfach.

Gegeben:

%Vor%

und obere / untere Länge sowie rechte / linke Länge.

x1 = top_middle_x - oben / unten_length / 2; x2 = x1 + obere / untere_Länge;

y1 = top_middle_y y2 = bottom_middle_y

Offensichtlich ist das der einfachste Fall und wir nehmen an, dass die Linie von (tmx, tmy) (bmx, bmy) nur entlang der Y-Achse liegt.

Wir nennen diese Zeile die "Mittellinie".

Der nächste Trick besteht darin, die Mittellinie zu nehmen und ihren Rotationsversatz von der Y-Achse zu berechnen.

Nun, mein Trigon ist super rostig.

dx = tmx - bmx, dy = tmy - bmy.

Also ist die Tangente des Winkels dy / dx. Der Arkustangens (dy / dx) ist der Winkel der Linie.

Daraus können Sie sich orientieren.

(Denken Sie daran, es gibt einige Spiele mit Quadranten und Zeichen und Zeug, um das richtig zu machen - aber das ist der Kern davon.)

Sobald Sie die Ausrichtung haben, können Sie die Linie wieder auf die Y-Achse "drehen". Nachschlagen 2D-Grafiken für die Mathematik, es ist einfach.

Das bringt dir deine normale Orientierung. Berechnen Sie dann die Rechtecke in dieser neuen Normalform und drehen Sie sie schließlich zurück.

Viola. Rechteck.

Andere Dinge, die Sie tun können, ist "rotieren" eine Linie, die die halbe Länge der "oberen" Linie ist, wo es 90 Grad der Mittellinie ist. Also, sagen Sie, Sie haben eine Mittellinie, die 45 Grad ist. Sie würden diese Linie bei tmx, tmy beginnen und diese Linie 135 Grad (90 + 45) drehen. Dieser Punkt wäre deine "obere linke" Ecke. Drehe ihn -45 (45 - 90), um den Punkt "oben rechts" zu erhalten. Dann mach etwas ähnliches mit den unteren Punkten.

    
Will Hartung 08.02.2010 01:37
quelle
0

Berechnen Sie den Winkel der Linie, die die beiden Mittelpunkte verbindet, indem Sie eine Arcustangensfunktion verwenden, die auf den Vektor angewendet wird, den Sie dazwischen erhalten.

Ziehen Sie 90 Grad von diesem Winkel ab, um die Richtung der oberen Kante zu erhalten

Ausgehend vom oberen Mittelpunkt, bewegen Sie sich relativ (1/2 obere Breite x sin (Winkel), 1/2 obere Breite x cos (Winkel)) - das erhält den oberen rechten Eckpunkt.

Fahren Sie um das Rechteck herum fort und verwenden Sie dazu die Winkel und Breiten sin und cos

Als Test: Überprüfen Sie, ob Sie den Startpunkt erreicht haben

    
Ian Mercer 08.02.2010 01:40
quelle
0
%Vor%     
sleukeleire 24.04.2013 08:31
quelle