254 votes

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

Comment la fonction suivante peut-elle être mise en œuvre dans différents langages ?

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

  • Rayon
  • Angle
  • Origine (paramètre facultatif, si la langue le permet)

655voto

Paul Dixon Points 122033

Le site é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 radians pour l'angle dans les fonctions trigonométriques, donc plutôt que de faire un cycle de 0 à 360 degrés, vous faites un cycle de 0 à 2PI radians.

118 votes

Notez que a doit être en radians - c'était vraiment difficile à comprendre pour moi en tant que débutant.

13 votes

Cela fait une heure que j'essaie de résoudre cette équation. Merci. Qui sait que les identités trigonométriques que tu as apprises au lycée seraient si utiles.

1 votes

Dean Pas besoin de parenthèses supplémentaires en raison de la préséance des opérateurs. Lorsque vous avez + et * comme dans ces deux équations et sans parenthèses, il faut toujours choisir l'expression * d'abord et ensuite pour le + .

56voto

Justin Ethier Points 57486

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);
    }

6 votes

Pré-calculez le facteur de conversion afin de réduire le risque de vous tromper en utilisant des chiffres codés en dur.

18voto

Pete Kirkham Points 32484

Qui a besoin de trigonométrie quand on a 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 ) );
}

0 votes

Comment cela fonctionne-t-il ? Comment se compare-t-il en termes de vitesse ? Pourquoi n'est-il pas plus couramment utilisé ?

0 votes

@MarkA.Ropper comment fonctionnent les nombres complexes ? - Cherchez un tutoriel de maths ou allez à partir de fr.wikipedia.org/wiki/Euler%27s_identity si vous savez déjà ce qu'est un nombre complexe. La vitesse n'est probablement pas aussi efficace que celle de l'implémentation d'un péché sous forme de table de consultation, mais il arrive parfois que l'on utilise des nombres complexes pour représenter des points afin d'exploiter d'autres propriétés de ces derniers. Comme pour l'utilisation des quaternions pour les rotations 3D, ce n'est pas vraiment la vitesse qui compte, mais les possibilités qu'ils vous offrent.

10voto

KostasX Points 376

Mis en œuvre dans 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.sin(angle);
    const y = cy + radius * Math.cos(angle);
    return [ x, y ];

}

Utilisation :

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

Codepen

/**
 * 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.sin(angle);
  const y = cy + radius * Math.cos(angle);
  return [ x, y ];
}

const canvas = document.querySelector("canvas");
const ctx = canvas.getContext("2d");

function draw( x, y ){

  ctx.clearRect( 0, 0, canvas.width, canvas.height );
  ctx.beginPath();
  ctx.strokeStyle = "orange";
  ctx.arc( 100, 100, 80, 0, 2 * Math.PI);
  ctx.lineWidth = 3;
  ctx.stroke();
  ctx.closePath();

  ctx.beginPath();
  ctx.fillStyle = "indigo";
  ctx.arc( x, y, 6, 0, 2 * Math.PI);
  ctx.fill();
  ctx.closePath();

}

let angle = 0;  // In degrees
setInterval(function(){

  const [ x, y ] = pointsOnCircle({ radius: 80, angle: angle++, cx: 100, cy: 100 });
  console.log( x, y );
  draw( x, y );
  document.querySelector("#degrees").innerHTML = angle + "&deg;";
  document.querySelector("#points").textContent = x.toFixed() + "," + y.toFixed();

}, 100 );

<p>Degrees: <span id="degrees">0</span></p>
<p>Points on Circle (x,y): <span id="points">0,0</span></p>
<canvas width="200" height="200" style="border: 1px solid"></canvas>

2voto

Bruce B Wilson Points 35

Calculer un point sur la circonférence d'un cercle en fonction de la distance parcourue.
A titre de comparaison... Cela peut être utile dans l'IA des jeux lorsqu'on se déplace autour d'un objet solide en suivant une trajectoire directe.

enter image description here

public static Point DestinationCoordinatesArc(Int32 startingPointX, Int32 startingPointY,
    Int32 circleOriginX, Int32 circleOriginY, float distanceToMove,
    ClockDirection clockDirection, float radius)
{
    // Note: distanceToMove and radius parameters are float type to avoid integer division
    // which will discard remainder

    var theta = (distanceToMove / radius) * (clockDirection == ClockDirection.Clockwise ? 1 : -1);
    var destinationX = circleOriginX + (startingPointX - circleOriginX) * Math.Cos(theta) - (startingPointY - circleOriginY) * Math.Sin(theta);
    var destinationY = circleOriginY + (startingPointX - circleOriginX) * Math.Sin(theta) + (startingPointY - circleOriginY) * Math.Cos(theta);

    // Round to avoid integer conversion truncation
    return new Point((Int32)Math.Round(destinationX), (Int32)Math.Round(destinationY));
}

/// <summary>
/// Possible clock directions.
/// </summary>
public enum ClockDirection
{
    [Description("Time moving forwards.")]
    Clockwise,
    [Description("Time moving moving backwards.")]
    CounterClockwise
}

private void ButtonArcDemo_Click(object sender, EventArgs e)
{
    Brush aBrush = (Brush)Brushes.Black;
    Graphics g = this.CreateGraphics();

    var startingPointX = 125;
    var startingPointY = 75;
    for (var count = 0; count < 62; count++)
    {
        var point = DestinationCoordinatesArc(
            startingPointX: startingPointX, startingPointY: startingPointY,
            circleOriginX: 75, circleOriginY: 75,
            distanceToMove: 5,
            clockDirection: ClockDirection.Clockwise, radius: 50);
        g.FillRectangle(aBrush, point.X, point.Y, 1, 1);

        startingPointX = point.X;
        startingPointY = point.Y;

        // Pause to visually observe/confirm clock direction
        System.Threading.Thread.Sleep(35);

        Debug.WriteLine($"DestinationCoordinatesArc({point.X}, {point.Y}");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X