8 Stimmen

Wie kann ich, wenn ich zwei Punkte eines Rechtecks kenne, die beiden anderen bestimmen?

Hallo Leute, ich lerne gerade Processing.js und bin auf ein mathematisches Problem gestoßen, das ich mit meinen begrenzten Geometrie- und Trigonometriekenntnissen oder mit Hilfe von Wikipedia nicht lösen kann.

Ich muss ein Rechteck zeichnen. Um dieses Rechteck zu zeichnen, muss ich die Koordinatenpunkte der einzelnen Ecken kennen. Alles, was ich weiß, sind x und y für die Mittelpunkte der Ober- und Unterseite des Kastens und die Länge aller vier Seiten.

Es gibt keine Garantie für die Ausrichtung des Kartons.

Irgendeine Hilfe? Dies scheint wie es sollte einfach sein, aber es ist wirklich stumpf mich.

10voto

Charles Bretana Punkte 137391

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

Wenn die Punkte (x1, y1) und (x2, y2) nicht genau senkrecht (x1 = x2) oder waagerecht (y1 = y2) sind, dann ist die Neigung einer Kante des Rechtecks

m1 = (y2-y1) / (x2-x1) 

und die Neigung der anderen Kante ist:

m2 = - 1 / m1

Wenn man die Seitenlängen und die Mittelpunkte zweier gegenüberliegender Seiten kennt, kann man die Eckpunkte leicht bestimmen, indem man dx, dy zu den Mittelpunkten addiert: (wenn L die Länge der Seiten ist, auf denen die Mittelpunkte liegen)

dx = Sqrt( L^2 / (1 + m2^2) ) / 2

y

dy = m2 * dx

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.

6voto

Dave Punkte 4340

Wenn Sie wissen, dass Ihr Viereck ein Rechteck ist, können Sie mit einfacher Vektorrechnung die Koordinaten der Ecken bestimmen. Die bekannten Koordinaten sind:

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

Zunächst wird der Vektor zwischen den beiden bekannten Punkten ermittelt. Dieser Vektor ist parallel zu den Seitenlinien:

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

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

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

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

Anschließend drehen wir diesen Vektor um 90 Grad gegen den Uhrzeigersinn. Der gedrehte Vektor wird parallel zu den oberen und unteren Linien verlaufen. Bei einer Drehung um 90 Grad werden einfach die Koordinaten vertauscht und eine davon negiert. Sie können dies einfach durch Ausprobieren auf dem Papier sehen. Oder werfen Sie einen Blick auf die Gleichungen für 2D-Drehungen und um 90 Grad drehen.

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

Jetzt haben wir genug Informationen, um die linke obere Ecke zu finden. Wir beginnen einfach an unserem Punkt (x1, y1) und bewegen Sie sich 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 Addition der entsprechenden Vielfachen unserer Basisvektoren finden. Bei der Umsetzung können Sie die Berechnung natürlich beschleunigen, indem Sie jede einzelne Multiplikation nur ein einziges Mal 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)

2voto

Saverio Mancuso Punkte 25
  function getFirstPoint(x1,y1,x2,y2,l1,l2)
    distanceV = {x2 - x1, y2 - y1}
    vlen = math.sqrt(distanceV[1]^2 + distanceV[2]^2)
    normalized = {distanceV[1] / vlen, distanceV[2] / vlen}
    rotated = {-normalized[2], normalized[1]}
    p1 = {x1 - rotated[1] * l1 / 2, y1 - rotated[2] * l1 / 2}
    p2 = {p1[1] + rotated[1] * l1, p1[2] + rotated[2] * l1}
    p3 = {p1[1] + normalized[1] * l2, p1[2] + normalized[2] * l2}
    p4 = {p3[1] + rotated[1] * l1, p3[2] + rotated[2] * l1}
    points = { p1 , p2 , p3 , p4}
    return p1
end

0voto

Anon. Punkte 55933

Es ist definitiv ein Rechteck? Dann kennst du die Ausrichtung der kurzen Seiten (sie verlaufen parallel zur Linie zwischen deinen Punkten) und damit auch die Ausrichtung der langen Seiten.

Du kennst die Ausrichtung und Länge der langen Seiten und ihre Mittelpunkte, so dass es einfach ist, die Ecken von dort aus zu bestimmen.

Die Umsetzung bleibt dem Leser überlassen.

0voto

villintehaspam Punkte 8220

Das bedeutet, dass es zwei Linien gibt, die parallel zu der Linie zwischen den beiden Punkten verlaufen, die Sie haben. Ermitteln Sie die Ecken, indem Sie die Linie, die Sie haben, um die Hälfte der Länge der oberen Seite in jede Richtung senkrecht zu der Linie, die Sie haben, verschieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X