2009-05-08 19 views
185

¿Cómo se puede implementar la siguiente función en varios idiomas?¿Cómo calculo un punto en la circunferencia de un círculo?

calcular el punto de (x,y) en la circunferencia de un círculo, los valores de entrada dados de:

  • Radius
  • ángulo
  • Origen (parámetro opcional, si el apoyo de la lengua)
+2

Improbable, @Binary, ya que publicó una respuesta. Esta es una de las preguntas autocontestadas (que están permitidas, según comunicaciones anteriores de los moderadores). Pero dado que ya fue respondido en http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, probablemente sea mejor cerrarlo como una estafa. Los idiomas que hacen esto no serán tan dispares. – paxdiablo

+21

Acabo de iniciar sesión para decir esto: usted señor (Rook) es un idiota. No todos tienen el mismo nivel de educación que tú, pero aún así pueden codificar, así que no, esta no es una pregunta trivial sobre el código de golf. Qué verguenza. – Braineeee

Respuesta

468

El parametric equation for a circle es

x = cx + r * cos(a) 
y = cy + r * sin(a) 

Dónde r es el radio, cx, cy el origen, y un el ángulo.

Es bastante fácil de adaptar a cualquier idioma con funciones trigonométricas básicas. Tenga en cuenta que la mayoría de los lenguajes utilizará radians para el ángulo en las funciones trigonométricas, por lo que en vez de recorrer 0..360 grados, está ciclando a través de 0..2PI radianes.

+74

Tenga en cuenta que 'a' debe estar en radianes, eso fue realmente difícil para mí como principiante de entender. – ioanb7

+8

He estado tratando de derivar esta ecuación durante una hora. Gracias. ¿Quién sabe que las identidades trigonométricas que aprendiste en la escuela secundaria serían tan útiles? –

+1

@Dean No se necesitan corchetes adicionales debido a la precedencia del operador. Cuando tiene '+' y '*' como en esas dos ecuaciones y sin ningún paréntesis, siempre se usa el '*' primero y luego el '+'. – rbaleksandar

43

Aquí está mi implementación en C#:

public static PointF PointOnCircle(float radius, float angleInDegrees, PointF origin) 
    { 
     // Convert from degrees to radians via multiplication by PI/180   
     float x = (float)(radius * Math.Cos(angleInDegrees * Math.PI/180F)) + origin.X; 
     float y = (float)(radius * Math.Sin(angleInDegrees * Math.PI/180F)) + origin.Y; 

     return new PointF(x, y); 
    } 
+5

Precalcule el factor de conversión, por lo que hay menos posibilidades de que escriba la conversión incorrecta utilizando números codificados. –

16

Quién necesita trig cuando se tiene complex numbers:

#include <complex.h> 
#include <math.h> 

#define PI  3.14159265358979323846 

typedef complex double Point; 

Point point_on_circle (double radius, double angle_in_degrees, Point centre) 
{ 
    return centre + radius * cexp (PI * I * (angle_in_degrees/180.0)); 
} 
+0

¿Cómo funciona esto? ¿Cómo se compara la velocidad sabia? ¿Por qué no es esto más comúnmente usado? –

+0

@ MarkA.Ropper ¿cómo funcionan los números complejos? - busque un tutorial de matemáticas o vaya a https://en.wikipedia.org/wiki/Euler%27s_identity si ya sabe lo que es un número complejo. Probablemente no sea tan eficiente en velocidad en comparación con decir implementar el pecado como una tabla de búsqueda, pero a veces estás usando números complejos para representar puntos en todas partes para explotar otras propiedades de ellos. Al igual que con el uso de cuaterniones para rotaciones en 3D, no es realmente la velocidad sino las capacidades que te dan. –

Cuestiones relacionadas