Bagaimana cara menghitung titik pada keliling lingkaran?

223

Bagaimana fungsi berikut dapat diimplementasikan dalam berbagai bahasa?

Hitung (x,y)titik pada keliling lingkaran, berikan nilai input dari:

  • Radius
  • Sudut
  • Asal (parameter opsional, jika didukung oleh bahasa)
Justin Ethier
sumber

Jawaban:

593

The persamaan parametrik untuk lingkaran adalah

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

Di mana r adalah jari-jari, cx, cy asal, dan sebuah sudut.

Itu cukup mudah untuk beradaptasi ke bahasa apa pun dengan fungsi trigonometri dasar. Perhatikan bahwa sebagian besar bahasa akan menggunakan radian untuk sudut dalam fungsi trigonometri, jadi alih-alih bersepeda hingga 0,360 derajat, Anda bersepeda melalui radian 0..2PI.

Paul Dixon
sumber
107
Catatan yang aharus dalam radian - itu benar-benar sulit bagi saya sebagai pemula untuk mengerti.
ioan
13
Saya sudah mencoba menurunkan persamaan ini selama satu jam sekarang. Terima kasih. Siapa yang tahu identitas trigonometri yang Anda pelajari di sekolah menengah akan sangat membantu.
Isioma Nnodum
1
@Dean Tidak perlu kurung tambahan karena prioritas operator. Ketika Anda memiliki +dan *suka dalam dua persamaan dan tanpa tanda kurung Anda selalu pergi untuk yang *pertama dan kemudian untuk +.
rbaleksandar
13
@IsiomaNnodum Tidak mungkin bisa membantu jika kita semua kembali ke sini hanya untuk mengingat persamaannya.
b1nary.atr0phy
48

Ini implementasi saya di 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
sumber
5
Pra-hitung faktor konversi sehingga ada sedikit kemungkinan Anda salah mengetik konversi menggunakan nomor kode keras.
Scottie T
15

Siapa yang butuh trigonometri ketika Anda memiliki bilangan kompleks :

#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
sumber
Bagaimana cara kerjanya? Bagaimana cara membandingkan kecepatan bijaksana? Mengapa ini tidak lebih umum digunakan?
Mark A. Ropper
@ MarkA.Ropper bagaimana cara bilangan kompleks bekerja? - cari tutorial matematika atau kunjungi en.wikipedia.org/wiki/Euler%27s_identity jika Anda sudah tahu apa bilangan kompleks itu. Ini mungkin tidak seefisien dalam kecepatan dibandingkan dengan mengatakan menerapkan dosa sebagai tabel pencarian, tetapi kadang-kadang Anda menggunakan angka kompleks untuk mewakili poin di seluruh untuk mengeksploitasi sifat-sifat lain dari mereka. Mirip dengan menggunakan angka empat untuk rotasi 3D, itu bukan kecepatan tetapi kemampuan yang mereka berikan kepada Anda.
Pete Kirkham
2

Diimplementasikan dalam 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 ];

}

Pemakaian:

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

Codepen

KostasX
sumber