2014-09-19 14 views
11

Sto cercando di capire come potrei essere in grado di calcolare le coordinate su un cerchio. Per semplicità ho fatto alcune immagini.Come calcolare la posizione su un cerchio con un certo angolo?

http://i.stack.imgur.com/y1F2y.png

Questo è l'inizio con le informazioni che ho. Ora ho bisogno di calcolare le nuove coordinate quando per esempio il cerchio ruoterebbe di 90 gradi verso destra. Proprio come l'immagine successiva:

http://i.stack.imgur.com/ckopK.png

ho bisogno di calcolare le coordinate del nuovo punto rosso. (Ho anche bisogno di questo con diversi gradi come 20 gradi).

Per fare questo il mio piano era quello di effettuare le seguenti operazioni:

  • calcolare la distanza tra i due punti
  • calcolare il grado tra il nord (verso l'alto) e il punto dato
  • calcolare la nuova posizione con la laurea (da un passo indietro) + i gradi che deve girare (nelle immagini di 90 gradi).

Il mio primo passo è:

distance = Math.sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y)) 

La parte per il calcolo dei nuovi gradi è:

double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x); 
theta += Math.PI/2.0; 

E l'ultima parte per calcolare la nuova posizione sarebbe:

double x = mMiddleView.getX() + distance * Math.cos(Math.toRadians(theta)); 
double y = mMiddleView.getY() + distance * Math.sin(Math.toRadians(theta)); 

Tuttavia quando faccio questi calcoli con per esempio 0 gradi restituisce ancora un altro valore rispetto alle coordinate originali.

Qualsiasi aiuto sarebbe apprezzato!

Modifica per Philipp Jahoda:

I miei valori sono:

distance +- 70, currentDegree = 0. 
PointF point = new PointF((float)mMiddleView.getX(), (float)mMiddleView.getY()); 
PointF point2 = getPosition(point, (float) distance, currentDegree); 

ei miei risultati sono i seguenti:

center: PointF(490.0, 728.0) radius: 78.0 angle: 0.0 
new point: PointF(568.0, 728.0) 

Come si può vedere, il grado è 0 in modo che il punto non è dovrebbe girare. Dovrebbe mantenere le coordinate 490, 728 ma non le mantiene.

+3

Perché non puoi lavorare in coordinate polari per tutto il tempo? Converti in cartesiano solo per la fase di visualizzazione. – Bathsheba

+0

Altrimenti, questo link potrebbe aiutarti: http://en.wikipedia.org/wiki/Rotation_matrix – Bathsheba

+0

Stai utilizzando 'x' e' y' lo stesso. Fai attenzione che 'x' sta aumentando verso destra mentre' y' sta aumentando verso il basso così la tua parte 'targetPt.y - centerPt.y' dovrebbe essere l'opposto tra le altre cose – Eypros

risposta

14

Questo è quanto:

private PointF getPosition(PointF center, float radius, float angle) { 

    PointF p = new PointF((float) (center.x + radius * Math.cos(Math.toRadians(angle))), 
    (float) (center.y + radius* Math.sin(Math.toRadians(angle)))); 

    return p; 
} 

Questo metodo calcola la posizione intorno al centro di un cerchio (centro di immagine) secondo raggio e angolo. Angolo in gradi.

Il valore restituito PointF conterrà la coordinata x e y della posizione calcolata.

Essere consapevoli che 0 gradi è nella posizione molto ad est del cerchio, 270 gradi è nella posizione più a nord del circolo:

enter image description here

Quindi, se il centro del tuo punto di vista è a x: 100, y: 100 e si calcola la posizione con un angolo di 0 gradi e un raggio di 50, il risultato sarà x: 150, y: 100

Se si utilizza l'angolo di 90 gradi e raggio 50, il risultato sarà x: 100, y: 150

Si utilizza here nella mia libreria di grafici e funziona.

+0

Ho provato questo, ma ho riscontrato un problema. Sto mettendo i miei valori nel primo post perché non riesco a inserire il codice nei commenti. – Marc

+0

Dai un'occhiata al mio aggiornamento. 0 gradi si trova ad est del cerchio. Quindi il tuo calcolo è corretto. –

+0

Sei riuscito a risolvere il tuo problema? –

0

Questo richiede un po 'di matematica qui. Devi sapere se due linee sono perpendicolari l'una all'altra, La moltiplicazione del gradiente di queste due linee dovrebbe essere uguale a -1.

Poi

m1=(770-500)/(540-400)=27/14 

stesso modo

m2=(y-770)/(x-540) 

(x,y) è il punto che si desidera trovare.

Ora

m1*m2=-1 

Ora abbiamo ottenuto un'equazione. Ne hai bisogno un altro poiché ci sono due variabili da trovare

Puoi ottenerne un altro considerando il raggio del cerchio.

r=sqrt((540-400)^2+(770-500)^2) 

Allo stesso modo

r=sqrl((x-540)^2+(y-770)^2) 

Ora hai due equazione e ha solo bisogno di risolvere. Questo ti darà due serie di coordinate. Dal momento che ci possono essere -90 e 90 gradi.

0

Un modo elegante per ottenere questo risultato è utilizzare numeri complessi, ad esempio here.

In pseudo-codice:

z = (x_old + I*y_old)*exp(I*angle); 
x_new = real(z); 
y_new = imag(z); 

NOTA: la rotazione angle deve essere in radianti. NOTA 2: presuppone un cerchio centrato a (0,0). Basta aggiungere un turno se il centro non è lì.

Problemi correlati