Jak obliczyć punkt na obwodzie koła?

223

Jak można wdrożyć następującą funkcję w różnych językach?

Oblicz (x,y)punkt na obwodzie koła, biorąc pod uwagę wartości wejściowe:

  • Promień
  • Kąt
  • Pochodzenie (parametr opcjonalny, jeśli jest obsługiwany przez język)
Justin Ethier
źródło

Odpowiedzi:

593

Parametryczne Równanie dla okręgu jest

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

Gdzie r jest promieniem, CX, CY pochodzenie i kąt.

Łatwo jest dostosować go do dowolnego języka dzięki podstawowym funkcjom wyzwalania. Zauważ, że większość języków używa radianów do określania kąta w funkcjach triggera, więc zamiast cyklicznie przechodzić przez 0..360 stopni, przechodzisz cyklicznie przez 0..2PI.

Paul Dixon
źródło
107
Zauważ, że amusi być w radianach - to było dla mnie, jako początkującego, bardzo trudne do zrozumienia.
ioan
13
Próbuję wyprowadzić to równanie od godziny. Dzięki. Kto byłby w stanie poznać tożsamości trig, których nauczyłeś się w szkole średniej, byłby bardzo pomocny.
Isioma Nnodum
1
@Dean Nie ma potrzeby stosowania dodatkowych nawiasów ze względu na pierwszeństwo operatora. Kiedy masz +i *lubisz w tych dwóch równaniach i bez nawiasów, zawsze wybierasz *pierwszy, a następnie dla +.
rbaleksandar
13
@ IsiomaNnodum Nie mogłoby być tak pomocne, jeśli wszyscy wrócimy tutaj tylko po to, aby pamiętać, jakie było równanie.
b1nary.atr0phy
48

Oto moja implementacja w 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
źródło
5
Oblicz wstępnie współczynnik konwersji, aby zmniejszyć ryzyko błędnego wpisania konwersji przy użyciu liczb zakodowanych na stałe.
Scottie T
15

Kto potrzebuje wyzwalacza, gdy masz liczby zespolone :

#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
źródło
Jak to działa? Jak porównuje prędkość pod względem prędkości? Dlaczego nie jest to częściej używane?
Mark A. Ropper
@ MarkA.Ropper, jak działają liczby zespolone? - wyszukaj samouczek z matematyki lub przejdź do en.wikipedia.org/wiki/Euler%27s_identity, jeśli już wiesz, co to jest liczba zespolona. Prawdopodobnie nie jest tak wydajny w porównaniu do powiedzenia implementacji grzechu jak tabela przeglądowa, ale czasami używasz liczb zespolonych do reprezentowania punktów w celu wykorzystania innych ich właściwości. Podobnie do korzystania z czwartorzędów do obracania 3D, tak naprawdę nie jest to prędkość, ale możliwości, które dają.
Pete Kirkham
2

Zaimplementowane w 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 ];

}

Stosowanie:

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

Codepen

KostasX
źródło