2010-06-01 2 views
7

Bitte beziehen Sie sich auf mein Quick-Diagramm im Anhang.Fehlende Koordinaten. Grundlegende Trigonometrie-Hilfe

was ich versuche zu tun ist, die Koordinaten der gelben Punkte zu erhalten, indem Sie den Winkel von den bekannten Koordinaten der roten Punkte verwenden. Angenommen, jeder gelbe Punkt ist etwa 20 Pixel entfernt von dem x: 50/y: 250 roten Punkt im rechten Winkel (ich denke, dass es so heißt), wie bekomme ich ihre Koordinaten?

Ich glaube, das ist sehr grundlegende Trigonometrie und ich sollte Math.tan() verwenden, aber sie haben uns nicht viel Mathe in der Kunstschule gelehrt.

alt text http://www.freeimagehosting.net/uploads/e8c848a357.jpg

+0

Stimmt es bei all Ihren Problemen, dass sie auf 45 Grad ausgerichtet sind? –

+0

Entschuldigung, nicht sicher, was Sie fragen. Mathe ist wirklich nicht mein starker Anzug. Im obigen Diagramm fungiert das x: 200, y: 100 als Ankerpunkt. Wenn sich das Diagramm dreht, möchte ich die Formel kennen, um die Koordinaten der gelben Punkte zu erhalten, unabhängig davon, welchen Winkel die roten Punkte haben. Ich hoffe das ergibt Sinn. – TheDarkIn1978

+0

Ah, also ist es nicht in diesem Winkel festgelegt. Okay, Zeit, diese rotierende Vektorlösung zu schreiben! –

Antwort

7

Sie brauchen nicht wirklich trigs für diese ein. Verwenden Sie einfach Steigungen oder wechseln Sie in x und y.

eine Linie der Steigung Gegeben m = y/x, die Linie, die senkrecht zu dieser Linie hat Steigung -1/m oder -x/y. Die Steigung m zwischen den roten Punkten ist -150/150 oder -1/1. Ich habe Ihre positiven y Punkte nach unten bemerkt.

Daher ist die positive Steigung 1/1. Die Werte für x und y ändern sich mit der gleichen Geschwindigkeit.

Sobald Sie das wissen, dann sollte es ziemlich einfach sein, den Rest herauszufinden. Da sie im 45-Grad-Winkel ausgerichtet sind, ist das Kantenverhältnis des 45-45-90 Dreiecks 1 : 1 : sqrt(2). Wenn also Ihre Länge 20 ist, wäre die individuelle x- und y-Änderung 20/sqrt(2) oder ungefähr 14 in ganzen Zahlen.

Also, Ihre zwei gelben Punkte wäre bei (36, 236) und (64, 264). Wenn die Linien nicht zu einem geeigneten Grad ausgerichtet sind, müssten Sie arctan() oder etwas Ähnliches verwenden und den Winkel zwischen der Linie und der horizontalen Linie ermitteln, damit Sie das Verhältnis von x und y ändern können.

Ich hoffe, meine Antwort war nicht zu schwer zu folgen. Für eine allgemeinere Lösung siehe Troubadours Antwort.


Edit: Da die OP sagte der untere rote Punkt dreht tatsächlich um den oberen roten Punkt, müssen wir eine flexiblere Lösung statt.

Ich werde diese Antwort von Troubadour's erweitern, da ich genau dasselbe mache. Bitte beziehen Sie sich auf seinen Beitrag, wenn Sie meinen lesen.

1. den Vektor vom Ursprung Erhalten (200, 100) zu Punkt drehen (50, 250):

vector = (200 - 50, 100 - 250) = (150, -150) 

2. Ihre Vektor Drehen durch die x- und y-Swapping und negieren x den neuen Vektor zu erhalten:

vector = (150, -150) => swap => (-150, 150) => negate x => (150, 150) 

3. den Einheitsvektor Erhalten (der Länge 1) aus dem neuen Vektor:

vector = vector/length(vector) 
     = (150/length(vector), 150/length(vector)) 
     ~= (0.7071, 0.7071) 

     where 

     length(vector) = sqrt(150^2 + 150^2) ~= 212.2320 

4. der Verschiebungsvektor der Länge 20, erhalten durch den Einheitsvektor multipliziert wird.

displacement_vector = vector * 20 
        = (0.7071 * 20, 0.7071 * 20) 
        = (14.1421, 14.1421) 

5. Add/subtrahieren diesen Vektor zu/von Ihrem rotierenden Vektor (Punkt):

yellow_1 = (50, 250) + (14.1421, 14.1421) ~= (64, 254) 
yellow_2 = (50, 250) - (14.1421, 14.1421) ~= (36, 236) 

hoffe, dass ich die obigen Schritte Ihnen helfen, Ihren Code mit der Formulierung. Egal wie der Winkel ist, gleiche Schritte.

+0

Sie sagen, Sie brauchen nicht trig , dann schlagen Sie vor, arctan zu verwenden ... –

+1

Ich sagte "Sie brauchen nicht wirklich Auslöser für dieses", und "wenn die Linien nicht zu einem zweckmäßigen Grad ausgerichtet sind ..." Bitte nehmen Sie meine Wörter nicht aus dem Zusammenhang heraus . '=]' –

+1

+1 für das bearbeitete Bit.Imho-Vektor ist wirklich der Weg, um hier zu gehen, ob Sie nur den Spezialfall brauchen oder nicht. –

1

Es ist ziemlich einfach, wenn Sie wissen, dass es bei 45 Grad bleiben wird. Wenn der Abstand von 50, 250 20 beträgt, sind die Punkte (50 - (20*sqrt(2)), 250 - (20*sqrt(2))) und (50 + (20/sqrt(2)), 250 + (20/sqrt(2))).

Im Allgemeinen sollte der 20*sqrt(2) Teil von jedem durch (distance)*cos(angle) und distance*sin(angle) ersetzt werden. Einer ist für die x-Koordinate und einer für die y-Koordinate. (abhängig davon, auf welcher Seite Sie den Winkel messen!)

Zusammenfassend sollten Sie sin und cos verwenden. 45 Grad ist ein Spezialfall, bei dem sowohl sin als auch cos 1/sqrt(2) sind, also spielt es keine Rolle, in welcher Richtung man sie benutzt.

2

Da die gelben Punkte im rechten Winkel zur rot-roten Linie stehen, können Sie etwas einfacheres verwenden. Ich werde nicht die ganze Frage beantworten, aber ich werde versuchen, ein paar Hinweise zu geben:

Ignorieren Sie die tatsächliche Entfernung zu den gelben Punkten, stellen Sie sich andere Punkte auf der gleichen NW-SE-Linie, die gleiche Entfernung davon NE roter Punkt. Der Vektor dazu ist einfach der Vektor zum roten Punkt, um 90 Grad gedreht.

Das Drehen um 90 Grad kann durch Tauschen der Koordinaten und Invertieren einer dieser Koordinaten erfolgen.

Sobald Sie das haben, verschieben Sie diesen gelben Punkt in seine nähere Position, indem Sie diesen Vektor um die tatsächliche Entfernung skalieren (20).

4

Anruf bei dem rote Punkt (50, 250) A und der einer bei (200, 100) B.

Eine Möglichkeit würde sein, zuerst den Vektor AB dh

v_AB = (200 - 50, 100 - 250) = (150, -150) 

Man kann berechnen, Erzeugen Sie einen Vektor im rechten Winkel, indem Sie die Komponenten vertauschen und das Vorzeichen einer der beiden Komponenten umkehren. So

v_AB_perp = (150, 150) 

ist ein Vektor durch Drehen v_AB im Uhrzeigersinn gedreht, wie man es auf dem Bildschirm sehen. Sie können dies normalisieren, indem man durch durch die Größe einer Einheitsvektor erhalten heißt

v_AB_perp_normalised = v_AB_perp/|v_AB_perp| 

Um die gelben Punkte nur, indem du deinen 20 Pixel multiplizieren und addieren/subtrahieren es auf den Koordinaten von A.

+1

+1. Rotierende Vektoren sind eine viel bessere, allgemeine Lösung. –

+2

Ich schätze das OP wird das nicht wissen | Z | = sqrt (Z.x * Z.x + Z.y * Z.y) –

+0

@jk: Heh, ich habe es als "die Länge des Vektors" gelesen, aber danke, dass du das gezeigt hast. –

2

Dies sollte funktionieren (ich werde beziehen sich nur auf die am weitesten links stehenden gelben Punkt, aber wir werden die Koordinaten sowohl im Ende erhalten): durch die

  1. Finden Sie die Neigung der Linie gegeben zwei rote Punkte.
  2. Finden Sie die Gleichung der Linie zwischen dem gelben Punkt und dem roten Punkt (d2).
  3. Finden der Koordinaten der gelbe Punkte durch die Geradengleichung d2 und unter Verwendung der Tatsache, dass der Abstand vom tiefsten Punkt 20 ist rot

Für 1:

die Steigung finden: m = (y1 - y2)/(x1 - x2) = (250 - 100)/(50 - 200) = 150/-150 = -1

für 2:

Wir wissen, dass d1 (Linie zwischen den roten Punkten) ist senkrecht auf d2 (Linie zwischen rotem Punkt und gelbem Punkt), und deshalb muss das Produkt ihrer Neigungen -1 sein. Daher ist die Neigung von d2m = 1

daher die Gleichung lautet: d2: y - 250 = x - 50 => d2: y - x = 200

Für 3:

Die erforderliche gelben Punkt auf der Linie liegt d2, und dessen Abstand zu dem niedrigsten roten Punkt ist 20. Lösen Sie das Gleichungssystem:

y - x = 200 
(x - 50)^2 + (y - 250)^2 = 400 

Die Berechnung ziemlich hässlich wird, aber es mit Mathematica Lösung gibt:

{{x -> 35.8579, y -> 235.858}, {x -> 64.1421, y -> 264.142}}

Das ist, wo Ihre zwei gelbe Punkte liegen!

Programmgesteuert können Sie ein solches System einfach lösen, indem Sie in der zweiten Gleichung y = 200 + x ersetzen und dann alles auf einer Seite verschieben und es als quadratische Gleichung lösen.