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.