¿Cómo calculo un punto en la circunferencia de un círculo?

223

¿Cómo se puede implementar la siguiente función en varios idiomas?

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

  • Radio
  • Ángulo
  • Origen (parámetro opcional, si es compatible con el idioma)
Justin Ethier
fuente

Respuestas:

593

La ecuación paramétrica para un círculo es

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

Donde r es el radio, cx, cy el origen y a el ángulo.

Eso es bastante fácil de adaptar a cualquier idioma con funciones trigonométricas básicas. Tenga en cuenta que la mayoría de los idiomas usarán radianes para el ángulo en las funciones trigonométricas, por lo que, en lugar de recorrer 0..360 grados, está recorriendo 0..2PI radianes.

Paul Dixon
fuente
107
Tenga en cuenta que adebe estar en radianes, eso fue muy difícil para mí como principiante de entender.
ioan
13
He estado tratando de derivar esta ecuación durante una hora ahora. Gracias. Quien conozca las identidades trigonométricas que aprendió en la escuela secundaria sería muy útil.
Isioma Nnodum
1
@Dean No hay necesidad de corchetes adicionales debido a la precedencia del operador. Cuando tienes +y te *gusta en esas dos ecuaciones y sin paréntesis, siempre vas por el *primero y luego por el +.
rbaleksandar
13
@IsiomaNnodum No podría haber sido tan útil si todos volviéramos aquí solo para recordar cuál era la ecuación.
b1nary.atr0phy
48

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);
    }
Justin Ethier
fuente
55
Calcule previamente el factor de conversión para que haya menos posibilidades de escribir mal la conversión usando números codificados.
Scottie T
15

Quién necesita trigonometría cuando tienes números complejos :

#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 ) );
}
Pete Kirkham
fuente
¿Como funciona esto? ¿Cómo se compara la velocidad sabia? ¿Por qué no se usa esto más comúnmente?
Mark A. Ropper
@ MarkA.Ropper, ¿cómo funcionan los números complejos? - busque un tutorial de matemáticas o vaya a en.wikipedia.org/wiki/Euler%27s_identity si ya sabe qué es un número complejo. Probablemente no sea tan eficiente en velocidad en comparación con la implementación del pecado como una tabla de búsqueda, pero a veces está usando números complejos para representar puntos en todo momento para explotar otras propiedades de ellos. Similar al uso de quaternions para rotaciones 3D, no es realmente la velocidad sino las capacidades que le brindan.
Pete Kirkham
2

Implementado en JavaScript (ES6) :

/**
    * Calculate x and y in circle's circumference
    * @param {Object} input - The input parameters
    * @param {number} input.radius - The circle's radius
    * @param {number} input.angle - The angle in degrees
    * @param {number} input.cx - The circle's origin x
    * @param {number} input.cy - The circle's origin y
    * @returns {Array[number,number]} The calculated x and y
*/
function pointsOnCircle({ radius, angle, cx, cy }){

    angle = angle * ( Math.PI / 180 ); // Convert from Degrees to Radians
    const x = cx + radius * Math.cos(angle);
    const y = cy + radius * Math.sin(angle);
    return [ x, y ];

}

Uso:

const [ x, y ] = pointsOnCircle({ radius: 100, angle: 180, cx: 150, cy: 150 });
console.log( x, y );

Codepen

KostasX
fuente