android - tiene - Calcule el punto del centro del arco, sabiendo que es grados de inicio y fin
cuantos radianes tiene una circunferencia (1)
La descripción más rápida de esta respuesta es que estoy tratando de encontrar las coordenadas del punto blanco. El rojo oscuro es un arco dibujado sobre un círculo dibujado (azul oscuro).
La explicación más larga: tengo una clase que extiende View
y que dibuja un círculo en el lienzo (el lienzo tiene el mismo ancho y alto):
canvas.drawArc(rectF, 0, 360, true, paint); // mOvals is a RectF object with 4 coordinates
Luego dibujo un arco que es N por ciento ancho (digamos 225 en este caso). El arco comienza desde -90 grados (porque 0 grados en el lienzo significa 3''o relojes) y "se desvía" N grados (225 en este ejemplo).
Estoy tratando de calcular las coordenadas X / Y o el centro del arco restante (el área que no está cubierta por el arco rojo, es decir, entre N y 360).
Tengo el radio del círculo que es canvasWidth / 2 si eso es de alguna ayuda.
Así es como dibujo el arco rojo:
long arcEnd = (360 * fractionNumber) / totalNumber;
canvas.drawArc(rectF, -90, arcEnd, true, paint);
(Respuesta original actualizada. Puede ser un poco demasiado detallado ahora, pero espero que ayude).
Está buscando las coordenadas XY (llamadas coordenadas cartesianas), pero estas son difíciles de calcular directamente. El truco es pasar primero por las coordenadas Polares. Polar y cartesiano son dos formas de expresar lo mismo, es decir, un punto en una cuadrícula y se pueden convertir entre sí.
Las coordenadas polares consisten en el ángulo y la distancia desde el punto central. Puedes calcular el ángulo deseado porque conoces el porcentaje del círculo que necesitas cubrir y puedes calcular la distancia desde el centro porque conoces el radio del círculo.
Su arco de cobertura es de 225 grados, por lo que el resto es 135 y la mitad es 67.5 grados. El ángulo para el punto que estás buscando es, por lo tanto, 225 + 67.5 = 292.5 grados . El radio de ese punto es la mitad del radio del círculo, por lo que es canvasWidth/4
.
Una vez que haya determinado la coordenada polar, (292.5, canvasWidth/4)
, (292.5, canvasWidth/4)
a la coordenada XY utilizando la función de conversión . Hay una cosa que es un poco complicada: Math.cos(double)
y Math.sin(double)
esperan que su argumento esté en radianes , no en grados. Usted expresa su 292.5 / 360 como x / 2π antes de realizar la conversión, lo que hace al multiplicar el valor por π / 180, dando 5.1051 en este caso.
Suponiendo que canvasWidth
es 400:
double tdeg 292.5d; // Calculated from arc percentage
int r = 100; // Calculated from canvas width
double trad = tdeg * (Math.PI/180d); // = 5.1051
int x = (int) r * Math.cos(trad);
int y = (int) r * Math.sin(trad);