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)

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.


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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.