2010-02-08 3 views
8

Hey Leute, ich lerne processing.js, und ich bin auf ein mathematisches Problem gestoßen, das ich mit meinen begrenzten Geometrie- und Trigonometriekenntnissen oder mit Hilfe von Wikipedia nicht lösen kann.Wissen zwei Punkte eines Rechtecks, wie kann ich die anderen beiden herausfinden?

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.

+0

ich wieder meine Antwort nehmen .. Das ist lösbar! – Dolph

+0

Ich nehme an, dass das in jedem Winkel gedreht werden kann und Sie den Winkel nicht kennen? – Casey

+0

@Casey, richtig. – icco

Antwort

8

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, dann ist es nicht lösbar)

wenn die Punkte (x1, y1) und (x2, y2) sind und wenn die zwei Punkte nicht perfekt vertikal sind (x1 = x2) oder horizontal (y1 = y2) ist, dann ist die Neigung einer Kante des Rechtecks ​​

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

und die Neigung der anderen Flanke ist:

m2 = - 1/m1 

Wenn man die Längen der Seiten kennen, und die Mittelpunkte von zwei gegenüberliegenden Seiten, dann werden die corrner Punkte leicht durch Addieren von dx, dy zu den Mittelpunkten bestimmt: (wenn L die Länge ist den Seiten, die die Mittelpunkte eingeschaltet sind)

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

und

dy = m2 * dx 

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

+0

Ehrfürchtig. Genau das habe ich gebraucht. Vielen Dank. – icco

+0

Mit dieser Methode müssen Sie sicherstellen, dass Sie spezielle Fälle hinzufügen, wenn 'x1 == x2' oder' y1 == y2', sonst werden Sie am Ende durch Null dividieren.Das Berechnen mit Vektoren anstelle von Steigungen vermeidet dies (obwohl Sie immer noch überprüfen müssen, dass Ihre zwei Punkte nicht genau gleich sind). – Dave

+0

@Dave, richtig, Sir, ich habe meine Antwort bearbeitet, um diesen Fall anzugehen. –

0

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

Sie kennen die Ausrichtung und Länge der langen Seiten, und Sie kennen ihre Mittelpunkte, so dass es von dort aus leicht ist, die Ecken zu finden.

Die Umsetzung bleibt dem Leser als Übung überlassen.

+0

die langen Seiten sind parallel zu der Linie, die ich ja kenne. Ich kenne auch die Länge der kurzen Seiten und ihre Neigung, weil ich die Neigung der einen Linie senkrecht zu ihnen kenne. Ich weiß immer noch nicht, wie ich diese vier Punkte bekommen soll. Vielleicht erscheint dir das einfach, aber ich habe wenig mathematischen Hintergrund. – icco

+0

Sie kennen den Mittelpunkt und die Länge der Seite, auf der der Mittelpunkt liegt. Das bedeutet, dass die Ecke "Länge/2" von diesem Punkt entfernt ist. Du kennst also die Richtung, und du kennst die Entfernung ... was brauchst du noch zu wissen? –

0

Dies bedeutet, dass es zwei Linien parallel zu der Linie zwischen den zwei Punkten gibt, die Sie haben. Holen Sie sich die Ecken, indem Sie die Linie, die Sie 1/2 der Länge der Oberseite haben, in jede Richtung senkrecht zu der Linie, die Sie haben, übersetzen.

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 dass x der Mittelpunkt plus/minus der Breite des Rechtecks ​​ist . Dies gilt auch für den unteren Bereich.

Sobald Sie die vier Ecken haben, müssen Sie sich keine Gedanken über die Seitenlängen machen, da ihre Punkte die gleichen sind wie für die oberen und unteren Ecken.

      midpoint 
    x,10     10,10     x,10 
     *--------------------------------------------* 
         width = 30 

    mx = midpoint x. 
    top left corner = (w/2) - mx or 15 - 10 
    top left corner coords = -5,10 

    mx = midpoint x. 
    top right corner = (w/2) + mx or 15 + 10 
    top left corner coords = 25,10 
+0

Diese Box ist in einem unbekannten Winkel, wie kann ich davon ausgehen, dass y gleich bleibt? – icco

0

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

Wenn Sie den Mittelpunkt von oben und unten und die Seitenlängen haben, ist der Rest einfach.

Gegeben:

(x1, y1) -- (top_middle_x, top_middle_y) -- (x2, y1) 

(x1, y2) -- (btm_middle_x, btm_middle_y) -- (x2, y2) 

und oben/unten Länge zusammen mit rechts/links Länge.

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

y1 = y2 = top_middle_y bottom_middle_y

Offensichtlich, das ist der einfachste Fall und unter der Annahme, daß die Linie von (TMX, tmy) (BMX, BMY) ausschließlich entlang der Y-Achse ist.

Wir nennen diese Linie die "Mittellinie".

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

Jetzt ist meine Trigon 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.

Davon können Sie sich orientieren.

(Geist, gibt es einige Spiele mit Quadranten und Zeichen, und so diese richtig zu machen - aber das ist der Kern von ihm.)

Sobald Sie die Orientierung haben, können Sie „drehen“ die Zeile zurück zur Y-Achse. Nachschlagen 2D-Grafiken für die Mathematik, es ist einfach.

Das bekommt Sie Ihre 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.

0

Berechnen Sie den Winkel der Linie, die die beiden Mittelpunkte verbindet, indem Sie eine Arcustangensfunktion auf den Vektor anwenden, den Sie zwischen ihnen erhalten.

Subtract 90 Grad von diesem Winkel die Richtung der oberen Kante

Ausgehend von dem oben in der Mitte Punkt zu gelangen, bewegen sich relativ (1/2 sin obere Breite x (Winkel), 1/2 x obere Breite cos (Winkel)) - das bekommt den oberen rechten Eckpunkt.

Weiter um das Rechteck die Sinus und Kosinus des Winkels und Breite entsprechend

Als Test: überprüfen Sie es zurück zum Ausgangspunkt

5

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

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

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

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

Wir brauchen diesen Vektor zu normalisieren (das heißt es Länge 1 machen), so können wir es später als Grundlage verwenden, um unsere Koordinaten zu finden.

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 betrachten Sie die equations for 2D rotations und ersetzen Sie sie in 90 Grad.

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

Jetzt haben wir genug Informationen, um die ‚oben links‘ Ecke zu finden. Wir beginnen einfach an unserer Stelle (x1, y1) und zurück entlang der Seite um die Hälfte der Seitenlänge bewegen:

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

Von hier haben wir die restlichen Punkte nur durch Zugabe der entsprechenden Multiples unserer Basisvektoren finden. Wenn diese Umsetzung können Sie es natürlich auf beschleunigen, indem nur jeder eindeutige Multiplikation ein einziges Mal die Berechnung:

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

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

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

0
/* rcx = center x rectangle, rcy = center y rectangle, rw = width rectangle, rh = height rectangle, rr = rotation in radian from the rectangle (around it's center point) */ 

function toRectObjectFromCenter(rcx, rcy, rw, rh, rr){ 
    var a = { 
     x: rcx+(Math.sin((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)), 
     y: rcy-(Math.cos((rr-degToRad(90))+Math.asin(rh/(Math.sqrt(rh*rh+rw*rw)))) * (Math.sqrt(rh*rh+rw*rw)/2)) 
    }; 
    var b = { 
     x: a.x+Math.cos(rr)*rw, 
     y: a.y+Math.sin(rr)*rw 
    }; 
    var c = { 
     x: b.x+Math.cos(degToRad(radToDeg(rr)+90))*rh, 
     y: b.y+Math.sin(degToRad(radToDeg(rr)+90))*rh 
    }; 
    var d = { 
     x: a.x+Math.cos(degToRad(radToDeg(rr)+90))*rh, 
     y: a.y+Math.sin(degToRad(radToDeg(rr)+90))*rh 
    }; 
    return {a:a,b:b,c:c,d:d}; 
} 
2
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 
Verwandte Themen