Comment calculer un point sur la circonférence d'un cercle?

223

Comment la fonction suivante peut-elle être implémentée dans différentes langues?

Calculez le (x,y)point sur la circonférence d'un cercle, étant donné les valeurs d'entrée de:

  • Rayon
  • Angle
  • Origine (paramètre facultatif, si pris en charge par la langue)
Justin Ethier
la source

Réponses:

593

L' équation paramétrique d'un cercle est

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

r est le rayon, cx, cy l'origine et a l'angle.

C'est assez facile à adapter dans n'importe quel langage avec des fonctions trigonométriques de base. Notez que la plupart des langues utilisent des radians pour l'angle dans les fonctions trigonométriques, donc plutôt que de parcourir 0..360 degrés, vous parcourez 0..2PI radians.

Paul Dixon
la source
107
Notez que cela adoit être en radians - c'était vraiment difficile pour moi en tant que débutant à comprendre.
ioan
13
J'essaie de dériver cette équation depuis une heure maintenant. Merci. Qui connaît les identités trigonomes que vous avez apprises au secondaire serait si utile.
Isioma Nnodum
1
@Dean Pas besoin de crochets supplémentaires en raison de la priorité de l'opérateur. Lorsque vous avez +et *comme dans ces deux équations et sans parenthèses, vous allez toujours pour la *première, puis pour la +.
rbaleksandar
13
@IsiomaNnodum Cela n'aurait pas pu être si utile si nous revenions tous ici juste pour nous rappeler quelle était l'équation.
b1nary.atr0phy
48

Voici mon implémentation 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
la source
5
Pré-calculez le facteur de conversion afin qu'il y ait moins de chances que vous tapiez mal la conversion en utilisant des nombres codés en dur.
Scottie T
15

Qui a besoin de trig lorsque vous avez des nombres complexes :

#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
la source
Comment cela marche-t-il? Comment se compare-t-il à la vitesse? Pourquoi n'est-ce pas plus couramment utilisé?
Mark A. Ropper
@ MarkA.Ropper comment fonctionnent les nombres complexes? - recherchez un didacticiel de mathématiques ou rendez-vous sur en.wikipedia.org/wiki/Euler%27s_identity si vous savez déjà ce qu'est un nombre complexe. Ce n'est probablement pas aussi efficace en vitesse que de dire implémenter sin comme une table de recherche, mais parfois vous utilisez des nombres complexes pour représenter des points partout pour en exploiter d'autres propriétés. Semblable à l'utilisation de quaternions pour les rotations 3D, ce n'est pas vraiment la vitesse mais les capacités qu'ils vous offrent.
Pete Kirkham
2

Implémenté 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 ];

}

Usage:

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

Codepen

KostasX
la source