Bir dairenin çevresindeki bir noktayı nasıl hesaplayabilirim?


223

Aşağıdaki işlev çeşitli dillerde nasıl uygulanabilir?

(x,y)Girdilerin girdi değerleri verildiğinde bir dairenin çevresindeki noktayı hesaplayın :

  • yarıçap
  • Açı
  • Kökeni (dil tarafından destekleniyorsa isteğe bağlı parametre)

Yanıtlar:


593

Bir daire için parametrik denklemi olan

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

Burada r yarıçapı, cx, cy başlangıç ​​noktası ve bir açıdır.

Temel trig fonksiyonları ile herhangi bir dile uyum sağlamak oldukça kolaydır. Çoğu dilin trig işlevlerinde açı için radyan kullanacağını unutmayın , bu nedenle 0..360 derece arasında bisiklet sürmek yerine 0..2PI radyanları arasında bisiklet sürüyorsunuz.


107
Bunun aradyan cinsinden olması gerektiğini unutmayın - yeni başlayanlar için bunu anlamak benim için çok zordu.
ioan

13
Bir saattir bu denklemi elde etmeye çalışıyorum. Teşekkürler. Lisede öğrendiğiniz trig kimliklerini bilen çok yardımcı olacaktır.
Isioma Nnodum

1
@Dean Operatör önceliği nedeniyle ekstra parantez gerekmez. Eğer varsa +ve *bu iki denklem ve herhangi parantez olmadan gibi her zaman için gitmek *için daha sonra ilk ve +.
rbaleksandar

13
@IsiomaNnodum Eğer buraya denklemin ne olduğunu hatırlamak için buraya geri dönersek, bu kadar yardımcı olamazdı.
b1nary.atr0phy

48

İşte benim uygulama 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
Dönüşüm faktörünü önceden hesaplayın, böylece sabit kodlu sayılar kullanarak dönüşümü yanlış yazma şansınız daha az olur.
Scottie T

15

Karmaşık sayılarınız olduğunda kimin tetiklemeye ihtiyacı var :

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

Bu nasıl çalışıyor? Hızı akıllıca nasıl karşılaştırır? Bu neden daha sık kullanılmıyor?
Mark A. Ropper

@ MarkA.Ropper Karmaşık sayılar nasıl çalışır? - karmaşık bir numaranın ne olduğunu zaten biliyorsanız , bir matematik dersine bakın veya en.wikipedia.org/wiki/Euler%27s_identity adresinden gidin . Muhtemelen hızlı bir şekilde, günahı bir arama tablosu olarak uygulamaktan daha etkili değildir, ancak bazen, diğer özelliklerinden yararlanmak için noktaları temsil etmek için karmaşık sayılar kullanırsınız. 3D dönüşler için kuaterniyonlar kullanmaya benzer şekilde, gerçekte hız değil, size verdikleri yeteneklerdir.
Pete Kirkham

2

Uygulanacak 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 ];

}

Kullanımı:

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

Codepen

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.