Come calcolo un punto sulla circonferenza di un cerchio?


223

Come può essere implementata la seguente funzione in varie lingue?

Calcola il (x,y)punto sulla circonferenza di un cerchio, dati i valori di input di:

  • Raggio
  • Angolo
  • Origine (parametro facoltativo, se supportato dalla lingua)

Risposte:


593

L' equazione parametrica per un cerchio è

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

Dove r è il raggio, cx, cy l'origine e un angolo.

È abbastanza facile adattarsi in qualsiasi lingua con le funzioni di base del trig. Si noti che la maggior parte delle lingue utilizzerà i radianti per l'angolo nelle funzioni di innesco, quindi anziché scorrere tra 0..360 gradi, si passa tra i radianti 0..2PI.


107
Nota che adeve essere nei radianti - è stato davvero difficile per me come un principiante da capire.
— ioan

13
Ho cercato di derivare questa equazione per un'ora ormai. Grazie. Chissà che identità di trigono hai imparato al liceo sarebbe così utile.
— Isioma Nnodum,

1
@Dean Non sono necessarie parentesi extra a causa della precedenza dell'operatore. Quando hai +e ti *piace in quelle due equazioni e senza parentesi, vai sempre per la *prima e poi per la +.
— rbaleksandar,

13
@IsiomaNnodum Non avrebbe potuto essere così utile se tornassimo tutti qui solo per ricordare quale fosse l'equazione.
— b1nary.atr0phy

48

Ecco la mia implementazione in 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
Calcola preventivamente il fattore di conversione, quindi hai meno possibilità di digitare la conversione in modo errato utilizzando numeri con codice fisso.
— Scottie T,

15

Chi ha bisogno di un trigantino quando hai numeri complessi :

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

Come funziona? Come si confronta la velocità saggia? Perché questo non è più comunemente usato?
— Mark A. Ropper,

@ MarkA.Ropper come funzionano i numeri complessi? - consulta un tutorial di matematica o vai da en.wikipedia.org/wiki/Euler%27s_identity se sai già cos'è un numero complesso. Probabilmente non è così efficiente in termini di velocità rispetto a dire l'implementazione del peccato come una tabella di ricerca, ma a volte stai usando numeri complessi per rappresentare punti in tutto per sfruttarne altre proprietà. Simile all'utilizzo dei quaternioni per le rotazioni 3D, non è proprio la velocità ma le capacità che ti danno.
— Pete Kirkham,

2

Implementato in 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.