2010-06-01 11 views
7

fare riferimento al mio schema rapido allegato in basso.Coordinate mancanti. Guida di trigonometria di base

quello che sto cercando di fare è ottenere le coordinate dei punti gialli utilizzando l'angolo dalle coordinate note dei punti rossi. supponendo che ogni punto giallo si trovi a circa 20 pixel di distanza da x: 50/y: 250 punti rossi ad angolo retto (penso che sia quello che viene chiamato) come ottengo le loro coordinate?

Credo che questa sia una trigonometria di base e dovrei usare Math.tan(), ma non ci hanno insegnato molto matematica nella scuola d'arte.

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

+0

È vero per tutti i tuoi problemi che saranno allineati a 45 gradi? –

+0

scusa, non sono sicuro di cosa stai chiedendo. la matematica non è DAVVERO il mio forte seme. nel diagramma sopra, x: 200, y: 100 fungerà da punto di ancoraggio. quando il diagramma sta girando, mi piacerebbe conoscere la formula per ottenere le coordinate dei punti gialli indipendentemente dall'angolo che stanno facendo i punti rossi. Spero che abbia un senso. – TheDarkIn1978

+0

Ah, quindi non è fissato a quell'angolo. Ok, è tempo di scrivere quella soluzione vettoriale rotante! –

risposta

7

in realtà non hanno bisogno di Trigs per questo. Basta usare pendenze o cambiare in x e .

Data una linea di pendenza m = y/x, la linea perpendicolare a tale linea ha la pendenza -1/m o -x/y.

La pendenza m tra i punti rossi è -150/150 o -1/1. Ho notato i tuoi positivi y punti giù.

Pertanto, la pendenza positiva è 1/1. Entrambe le tue xey cambia alla stessa velocità, con la stessa quantità.

Una volta che lo sai, allora dovrebbe essere abbastanza facile capire il resto. Poiché sono allineati a 45 gradi, il rapporto del bordo del triangolo 45-45-90 è 1 : 1 : sqrt(2). Quindi se la tua lunghezza è 20, la singola modifica xey sarà 20/sqrt(2) o approssimativamente 14 in numeri interi.

Quindi, i due punti gialli corrispondono a (36, 236) e (64, 264). Se le linee non sono allineate a un livello adeguato, è necessario utilizzare arctan() o qualcosa di simile e ottenere l'angolo tra la linea e la linea orizzontale, in modo da poter calcolare il rapporto tra x e y.

Spero che la mia risposta non sia stata troppo difficile da seguire. Per una soluzione più generale, vedi la risposta di Troubadour.


Edit: Poiché il PO detto punto rosso inferiore è effettivamente in rotazione attorno al punto rosso superiore, avremo bisogno di una soluzione più flessibile invece.

Ho intenzione di estendere questa risposta da quella di Troubadour, poiché sto facendo esattamente la stessa cosa. Si prega di fare riferimento al suo post mentre leggi il mio.

1. Ottenere il vettore di origine (200, 100) il punto rotante (50, 250):

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

2. Ruotare i vettori scambiando la x ed y, e negare x per ottenere il nuovo vettore:

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

3. Ottenere il versore (di lunghezza 1) dal nuovo vettore:

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. garantita vettore spostamento di lunghezza 20, moltiplicando il vettore unitario.

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

5. Aggiungi/sottrarre questo vettore al/dal vettore rotante (punto):

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

Spero che i passaggi precedenti aiutano a formulare il proprio codice. Non importa quale sia l'angolo in cui si trova, stessi passi.

+0

dici che non hai bisogno di trig , quindi suggerisci di usare arctan ... –

+1

Ho detto "In realtà non hai bisogno di trigsi per questo" e "Se le linee non sono allineate ad un livello conveniente ..." Per favore non togliere le mie parole dal contesto . '=]' –

+1

+1 per il bit modificato.il vettore imho è davvero il modo di andare qui se hai bisogno o meno del caso speciale. –

1

È abbastanza facile se si sa che resterà a 45 gradi. Se la distanza da 50, 250 è 20, i punti sono a (50 - (20*sqrt(2)), 250 - (20*sqrt(2))) e (50 + (20/sqrt(2)), 250 + (20/sqrt(2))).

In generale, la parte 20*sqrt(2) di ciascuna deve essere sostituita con (distance)*cos(angle) e distance*sin(angle). Uno è per la coordinata x e uno per la coordinata y. (a seconda del lato da cui si misura l'angolo!)

In sintesi, si dovrebbe usare sin e cos. 45 gradi è un caso speciale in cui sin e cos sono entrambi 1/sqrt(2) quindi non importa da che parte li usi.

2

Poiché i punti gialli sono disattivati ​​ad angolo retto rispetto alla linea rosso-rosso, è possibile utilizzare qualcosa di più semplice. Non risponderò a tutta la domanda, ma proverò a fornire alcuni indizi:

Ignorando la distanza effettiva dai punti gialli, immagina altri punti sulla stessa linea NW-SE, alla stessa distanza di quella Punto rosso NE. Il vettore è semplicemente il vettore del punto rosso, ruotato di 90 gradi.

La rotazione di 90 gradi può essere effettuata scambiando le coordinate e invertendone una.

Una volta ottenuto ciò, spostare quel punto giallo nella sua posizione più ravvicinata ridimensionandolo per la distanza reale (20).

4

chiamata il puntino rosso al numero (50, 250) A e quello di (200, 100) B.

Un modo sarebbe quello di calcolare prima il vettore AB cioè

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

Puoi generare un vettore ad angolo retto rispetto a quello scambiando i componenti e invertendo il segno di uno dei due componenti. Quindi

v_AB_perp = (150, 150) 

è un vettore ruotato ruotando v_AB in senso orario mentre lo si guarda sullo schermo. È possibile normalizzare questo per ottenere un vettore unitario dividendo attraverso dalla grandezza cioè

v_AB_perp_normalised = v_AB_perp/|v_AB_perp| 

Per ottenere i punti gialli basta moltiplicare questo dai vostri 20 pixel e aggiungere/sottraggono mai ad coordinate di A.

+1

+1. I vettori rotanti sono una soluzione molto migliore e generale. –

+2

Immagino che l'OP non sappia che | Z | = sqrt (Z.x * Z.x + Z.y * Z.y) –

+0

@jk: Heh, l'ho letto come "la lunghezza del vettore", ma grazie per averlo indicato. –

2

Questo dovrebbe funzionare (mi limiterò a riferisco al punto più a sinistra di colore giallo, ma ci arriveremo le coordinate di entrambi, alla fine):

  1. trovare la pendenza della linea proposta dal due punti rossi.
  2. Trova l'equazione della linea tra il punto giallo e il punto rosso (d2).
  3. trovare le coordinate dei punti gialli utilizzando l'equazione linea d2 e il fatto che la distanza dal punto più basso è rosso 20.

Per 1:

trovare la pendenza: m = (y1 - y2)/(x1 - x2) = (250 - 100)/(50 - 200) = 150/-150 = -1

Per 2:

sappiamo che d1 (la linea tra i punti rossi) è perpendicolare su d2 (linea tra punto rosso e punto giallo), pertanto il prodotto delle loro pendenze deve essere -1. Pertanto, la pendenza di d2 è m = 1

quindi l'equazione è: d2: y - 250 = x - 50 => d2: y - x = 200

Per 3:

Il punto giallo richiesto si trova sulla linea d2, e la sua distanza dal punto rosso basso è 20. Risolvere il sistema di equazioni:

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

Il calcolo diventa piuttosto brutto, ma risolvendo con Mathematica dà:

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

Ecco dove i vostri due punti gialli si trovano!

A livello di codice, è possibile risolvere facilmente tale sistema sostituendo y = 200 + x nella seconda equazione, quindi spostando tutto su un lato e risolvendolo come un'equazione quadratica.