c# - Encuentre el punto en un círculo con un punto central dado, radio y grado
geometry (8)
Estoy obteniendo resultados extraños cuando paso Ángulo como -360 a 360 en Cos (ángulo) o Sin (ángulo).
Creo que la razón por la cual tu intento no funcionó es porque estabas pasando ángulos en grados. Las funciones trigonométricas sin
y cos
esperan ángulos expresados en radianes, por lo que los números deben ser de 0
a 2*M_PI
. Para d
grados pasas M_PI*d/180.0
. M_PI
es una constante definida en el encabezado math.h
Han pasado 10 años desde que hice alguna matemática como esta ... Estoy programando un juego en 2D y moviendo a un jugador. Mientras muevo al jugador, estoy tratando de calcular el punto en un círculo a 200 píxeles de distancia de la posición del jugador con un ángulo positivo o negativo (grado) entre -360 y 360. La pantalla mide 1280x720 siendo 0,0 el punto central de la pantalla El jugador se mueve alrededor de todo este sistema de coordenadas cartesianas. El punto que trato de encontrar puede estar fuera de la pantalla.
Probé las fórmulas en el artículo Encuentra el punto con radio y ángulo, pero no creo entender qué es "Ángulo" porque obtengo resultados extraños cuando paso Ángulo como -360 a 360 en Cos (ángulo) o Sin (ángulo).
Entonces, por ejemplo, tengo ...
- 1280x720 en un plano cartesiano
- Punto central (la posición del jugador):
- deje x = un número entre mínimo -640 a máximo 640
- let y = un número entre -360 mínimo a 360 máximo
- Radio de círculo alrededor del jugador: let r always = 200
- Ángulo: deje a = un número dado entre -360 a 360 (permita que el negativo apunte hacia abajo o positivo hacia arriba, de modo que -10 y 350 darían la misma respuesta)
¿Cuál es la fórmula para devolver X en el círculo?
¿Cuál es la fórmula para devolver Y en el círculo?
Aquí está la implementación de c #. El método devolverá los puntos circulares que toman el radius
, el center
y el angle interval
como parámetro. El ángulo se pasa como Radian.
public static List<PointF> getCircularPoints(double radius, PointF center, double angleInterval)
{
List<PointF> points = new List<PointF>();
for (double interval = angleInterval; interval < 2 * Math.PI; interval += angleInterval)
{
double X = center.X + (radius * Math.Cos(interval));
double Y = center.Y + (radius * Math.Sin(interval));
points.Add(new PointF((float)X, (float)Y));
}
return points;
}
y el ejemplo de la llamada:
List<PointF> LEPoints = getCircularPoints(10.0f, new PointF(100.0f, 100.0f), Math.PI / 6.0f);
Debes publicar el código que estás usando. Eso ayudaría a identificar el problema exactamente.
Sin embargo, como mencionó medir su ángulo en términos de -360 a 360, probablemente esté usando las unidades incorrectas para su biblioteca de matemáticas. La mayoría de las implementaciones de las funciones de trigonometría usan radianes para su entrada. Y si usas grados en cambio ... tus respuestas serán extrañamente incorrectas.
x_oncircle = x_origin + 200 * cos (degrees * pi / 180)
y_oncircle = y_origin + 200 * sin (degrees * pi / 180)
Tenga en cuenta que también podría encontrarse con circunstancias en las que el cuadrante no es lo que cabría esperar. Esto se puede solucionar seleccionando cuidadosamente dónde está el ángulo cero, o verificando manualmente el cuadrante que espera y aplicando sus propios signos a los valores resultantes.
La respuesta debe ser exactamente lo contrario.
X = Xc + rSin (ángulo)
Y = Yc + rCos (ángulo)
donde Xc e Yc son las coordenadas centrales del círculo yr es el radio.
Las ecuaciones simples a las que has vinculado dan las coordenadas X e Y del punto en el círculo relativo al centro del círculo .
X = r * cosine(angle)
Y = r * sine(angle)
Esto le indica qué tan lejos está el punto desplazado del centro del círculo. Como tiene las coordenadas del centro (Cx, Cy), simplemente agregue el desplazamiento calculado.
Las coordenadas del punto en el círculo son:
X = Cx + (r * cosine(angle))
Y = Cy + (r * sine(angle))
Recomendar:
public static Vector3 RotatePointAroundPivot(Vector3 point, Vector3
pivot, Vector3 angles)
{
return Quaternion.Euler(angles) * (point - pivot) + pivot;
}
Sugiero usar matrices para este tipo de manipulaciones. Es el enfoque más genérico, vea el ejemplo a continuación:
// The center point of rotation
var centerPoint = new Point(0, 0);
// Factory method creating the matrix
var matrix = new RotateTransform(angleInDegrees, centerPoint.X, centerPoint.Y).Value;
// The point to rotate
var point = new Point(100, 0);
// Applying the transform that results in a rotated point
Point rotated = Point.Multiply(point, matrix);
- Nota al margen, la convención es medir el ángulo del eje X en sentido contrario a las agujas del reloj (positivo)
También necesitaba esto para formar el movimiento de las manecillas de un reloj en código. Probé varias fórmulas pero no funcionaron, así que esto es lo que se me ocurrió:
- movimiento - en sentido horario
- puntos - cada 6 grados (porque 360 grados divididos por 60 minutos son 6 grados)
- longitud de la mano - 65 píxeles
- centro - x = 75, y = 75
Entonces la fórmula sería
x=Cx+(r*cos(d/(180/PI))
y=Cy+(r*sin(d/(180/PI))
donde xey son los puntos en la circunferencia de un círculo, Cx y Cy son las coordenadas x, y del centro, r es el radio yd es la cantidad de grados.