¿Cómo calcular la posición en un círculo con un cierto ángulo?

Estoy tratando de averiguar cómo podría ser capaz de calcular las coordenadas en un círculo. Para simplificar hice algunas imágenes.

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

Ese es el comienzo con la información que tengo. Ahora necesito calcular las coordenadas nuevas cuando por ejemplo el círculo giraría 90 grados a la derecha. Al igual que la siguiente imagen:

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

Necesito calcular las coordenadas del nuevo punto rojo. (También necesito esto con diferentes grados como 20 grados).

Para hacer esto mi plan era hacer lo siguiente:

  • Calcular la distancia entre los dos puntos
  • Calcular el grado entre el norte (arriba) y el punto dado
  • Calcular la nueva ubicación con el grado (de un paso atrás) + los grados que necesita para girar (en las imágenes de 90 grados).

Mi primer paso es:

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

La parte para calcular los nuevos grados es:

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

Y la última parte para calcular la nueva ubicación sería:

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

Sin embargo, cuando hago estos cálculos con, por ejemplo, 0 grados, todavía devuelve otro valor que las coordenadas originales.

¡Cualquier ayuda sería apreciada!

Edit para Philipp Jahoda:

Mis valores son:

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

Y mis resultados son:

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

Como puede ver, el grado es 0, por lo que no se supone que el punto gira. Debe mantener las coordenadas 490, 728 pero no las mantiene.

Así es como:

 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; } 

Este método calcula la posición alrededor del centro de un círculo (centro de la vista) en función del radio y el ángulo. Ángulo en grados.

El PointF devuelto contendrá la coordenada xey de la posición calculada.

Tenga en cuenta que 0 grados está en la posición muy este del círculo, 270 grados está en la posición muy al norte del círculo:

Introduzca aquí la descripción de la imagen

Así que si el centro de la vista está en x: 100, y: 100 y se calcula la posición con un ángulo de 0 grados y un radio de 50, el resultado será x: 150, y: 100

Si utiliza el ángulo de 90 grados y el radio 50, el resultado será x: 100, y: 150

Se usa aquí en mi librería de gráficos, y funciona.

Esto necesita algunas matemáticas aquí. Necesitas saber si dos líneas son perpendiculares entre sí, La multiplicación de esas dos líneas gradiente debe ser igual a -1 .

Entonces

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

mismo camino

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

(x,y) es el punto que desea encontrar.

Ahora

 m1*m2=-1 

Ahora tenemos una ecuación. Necesita otro ya que hay dos variables que hay que buscar

Puede obtener otro considerando el radio del círculo.

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

Mismo camino

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

Ahora tienes dos ecuaciones y sólo necesita resolver. Esto le dará dos conjuntos de coordenadas. Ya que puede haber -90 y 90 grados.

Una manera elegante de lograr esto es usando números complejos, disponibles por ejemplo aquí .

En pseudo-código:

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

NOTA: el angle rotación debe ser en radianes. NOTE2: esto supone un círculo centrado en (0,0). Simplemente agregue un cambio si el centro no está allí.

  • Android getOrientation Azimut se contamina cuando el teléfono está inclinado
  • Obtener los siguientes N puntos geográficos más cercanos
  • Mover la mano Minuto en el reloj de Android
  • ¿Cómo obtengo el ángulo del teléfono en relación con el campo magnético de la Tierra?
  • Tengo problemas para entender lo que realmente obtiene GetDisplayRect () de PhotoView (construyendo una herramienta de recorte de fotos de android)
  • En C, tan (30) me da un valor negativo! ¿Por qué?
  • Configuración de la alarma en base mensual android
  • Dibuja un camino curvo en la lona?
  • ¿Cómo mostrar fórmulas matemáticas en mi aplicación Android?
  • MathML y ​​Java
  • Desplazamiento pequeño al calcular la rotación en función del punto de contacto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.