Як обчислити точку по колу кола?


223

Як можна реалізувати наступну функцію на різних мовах?

Обчисліть (x,y)точку на окружності кола, задавши вхідні значення:

  • Радіус
  • Кут
  • Походження (необов'язковий параметр, якщо підтримується мовою)

Відповіді:


593

Параметричне рівняння для кола є

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

Там , де R є радіус, сх, Cy походження і кут.

Це досить легко адаптуватися до будь-якої мови з основними функціями триггеру. Зауважте, що більшість мов використовуватимуть радіани для кута в триггерних функціях, тому замість того, щоб проїхати через 0..360 градусів, ви рухаєтеся по радіанах 0..2PI.


107
Зауважте, що це aповинно бути в радіанах - це мені як початківцю зрозуміло дуже важко.
Іоан

13
Я намагаюся отримати це рівняння вже годину. Дякую. Хто знає ідентичні факти, які ви дізналися у середній школі, були б такими корисними.
Ісіома Nnodum

1
@Dean Немає необхідності в додаткових дужках через перевагу оператора. Коли у вас є +і *подобається в цих двох рівняннях і без жодних дужок, ви завжди переходите до *першого, а потім до першого +.
rbaleksandar

13
@IsiomaNnodum Не міг би бути таким корисним, якби ми всі поверталися сюди, просто щоб згадати, що таке рівняння.
b1nary.atr0phy

48

Ось моя реалізація в 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
Попередньо обчисліть коефіцієнт перетворення, щоб менше шансів неправильно ввести конверсію за допомогою жорстко кодованих чисел.
Scottie T

15

Кому потрібен триг, коли у вас складні числа :

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

Як це працює? Як це порівнювати швидкість з розумом? Чому це не використовується частіше?
Марк А. Ропер

@ MarkA.Ropper Як працюють складні числа? - шукайте підручник з математики або перейдіть на en.wikipedia.org/wiki/Euler%27s_identity, якщо ви вже знаєте, що таке складне число. Це, мабуть, не так ефективно в швидкості порівняно, як, наприклад, реалізація гріха, як оглядова таблиця, але іноді ви використовуєте складні числа для представлення точок в цілому для використання інших їх властивостей. Подібно до використання кватерніонів для обертання 3D, насправді це не швидкість, а можливості, які вони вам дають.
Піт Кіркхем,

2

Реалізовано в 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 ];

}

Використання:

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

Codepen

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.