¿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.
- Fórmulas matemáticas en textview en android
- Determinación de números pares / impares (enteros)?
- Calcular la distancia entre dos puntos directamente en SQLite
- Implementar página curl en android?
- Escala alrededor de un punto específico en el sistema de coordenadas 2d
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:
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.
- Rectángulo Coordina con Respecto al Ángulo de Rotación
- 1000 * 60 * 60 * 24 * 30 resultados en un número negativo
- Cómo convertir de fracción de la cadena formateada en Decimal o Float en Java?
- Mostrar una buena fórmula de matemáticas en Android
- Convertir valores de ReplayGain a ajustes de volumen
- ¿Puede explicar (cálculos matemáticos) ejemplo de gesto (Levenshtein)?
- La mejor práctica para calcular la velocidad media de las coordenadas GPS
- Almacene la orientación en una matriz y compare
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:
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í.
- Acceso a bases de datos en Android
- OnNavigationItemSelected en ActionBar se está llamando en el inicio cómo puede evitarlo?