Como calculo um ponto na circunferência de um círculo?

223

Como a seguinte função pode ser implementada em vários idiomas?

Calcule o (x,y)ponto na circunferência de um círculo, com os valores de entrada de:

  • Raio
  • Ângulo
  • Origem (parâmetro opcional, se suportado pelo idioma)
Justin Ethier
fonte

Respostas:

593

A equação paramétrica para um círculo é

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

Onde r é o raio, cx, cy a origem e a o ângulo.

É muito fácil se adaptar a qualquer idioma com funções trigonométricas básicas. Observe que a maioria dos idiomas usa radianos para o ângulo nas funções trigonométricas. Portanto, em vez de percorrer 0..360 graus, você percorre 0..2PI radianos.

Paul Dixon
fonte
107
Note que adeve estar em radianos - foi muito difícil para mim, como iniciante, entender.
ioan
13
Estou tentando derivar essa equação há uma hora. Obrigado. Quem conhece as identidades trigonométricas que aprendeu no ensino médio seria muito útil.
Isioma Nnodum 28/05
1
@ Dean Não há necessidade de colchetes extras devido à precedência do operador. Quando você tem +e *gosta nessas duas equações e sem colchetes, sempre escolhe a *primeira e depois a +.
Rbaleksandar
13
@IsiomaNnodum Não poderia ter sido tão útil se todos nós voltarmos aqui apenas para lembrar qual era a equação.
precisa saber é o seguinte
48

Aqui está minha implementação em 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
fonte
5
Pré-calcule o fator de conversão, para que haja menos chances de digitar a conversão incorretamente usando números codificados.
8189 Scottie T
15

Quem precisa de trigonometria quando você tem números complexos :

#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
fonte
Como é que isso funciona? Como ele se compara à velocidade? Por que isso não é mais comumente usado?
Mark Ropper
@ MarkA.Ropper como funcionam os números complexos? - procure um tutorial de matemática ou acesse en.wikipedia.org/wiki/Euler%27s_identity se você já sabe o que é um número complexo. Provavelmente não é tão eficiente em velocidade em comparação com a implementação de pecado como uma tabela de consulta, mas às vezes você está usando números complexos para representar pontos em todo o percurso e explorar outras propriedades deles. Semelhante ao uso de quaternions para rotações 3D, não é realmente a velocidade, mas os recursos que eles oferecem.
Pete Kirkham
2

Implementado em 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
fonte