Wie berechne ich einen Punkt auf dem Umfang eines Kreises?


223

Wie kann die folgende Funktion in verschiedenen Sprachen implementiert werden?

Berechnen Sie den (x,y)Punkt auf dem Umfang eines Kreises mit den folgenden Eingabewerten:

  • Radius
  • Winkel
  • Ursprung (optionaler Parameter, falls von der Sprache unterstützt)

Antworten:


592

Die parametrische Gleichung für einen Kreis lautet

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

Dabei ist r der Radius, cx, cy der Ursprung und a der Winkel.

Das ist ziemlich einfach, sich in jede Sprache mit grundlegenden Triggerfunktionen anzupassen. Beachten Sie, dass die meisten Sprachen Radiant für den Winkel in Triggerfunktionen verwenden. Anstatt also durch 0..360 Grad zu radeln, radeln Sie durch 0..2PI Radiant.


106
Beachten Sie, dass adies im Bogenmaß sein muss - das war für mich als Anfänger sehr schwer zu verstehen.
Ioan

13
Ich habe jetzt seit einer Stunde versucht, diese Gleichung abzuleiten. Vielen Dank. Wer die Triggeridentitäten kennt, die Sie in der High School gelernt haben, wäre so hilfreich.
Isioma Nnodum

1
@Dean Aufgrund der Priorität des Operators sind keine zusätzlichen Klammern erforderlich. Wenn Sie diese beiden Gleichungen haben +und *mögen und ohne Klammern, entscheiden Sie sich immer für die *erste und dann für die +.
Rbaleksandar

12
@IsiomaNnodum Hätte nicht so hilfreich sein können, wenn wir alle hierher zurückgekommen wären, um uns daran zu erinnern, wie die Gleichung lautete.
b1nary.atr0phy

48

Hier ist meine Implementierung 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
Berechnen Sie den Umrechnungsfaktor vorab, damit die Wahrscheinlichkeit geringer ist, dass Sie die Umrechnung mit fest codierten Zahlen falsch eingeben.
Scottie T

15

Wer braucht Trigger, wenn Sie komplexe Zahlen haben :

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

Wie funktioniert das? Wie vergleicht es die Geschwindigkeit? Warum wird das nicht häufiger verwendet?
Mark A. Ropper

@ MarkA.Ropper Wie funktionieren komplexe Zahlen? - Schlagen Sie ein Mathe-Tutorial nach oder gehen Sie zu en.wikipedia.org/wiki/Euler%27s_identity, wenn Sie bereits wissen, was eine komplexe Zahl ist. Es ist wahrscheinlich nicht so schnell wie die Implementierung von sin als Nachschlagetabelle, aber manchmal verwenden Sie komplexe Zahlen, um Punkte durchgehend darzustellen und andere Eigenschaften von ihnen auszunutzen. Ähnlich wie bei der Verwendung von Quaternionen für 3D-Rotationen ist es nicht wirklich die Geschwindigkeit, sondern die Fähigkeiten, die sie Ihnen bieten.
Pete Kirkham

2

In JavaScript (ES6) implementiert :

/**
    * 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 ];

}

Verwendung:

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

Codepen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.