Как рассчитать точку на окружности круга?


223

Как реализовать следующую функцию на разных языках?

Вычислить (x,y)точку на окружности круга, учитывая входные значения:

  • Радиус
  • Угол
  • Происхождение (необязательный параметр, если поддерживается языком)

Ответы:


593

Параметрическое уравнение для окружности является

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

Где r - радиус, cx, cy - начало координат и a угол.

Это довольно легко адаптировать к любому языку с основными функциями триггера. Обратите внимание, что большинство языков будут использовать радианы для угла в функциях триггера, поэтому вместо циклического отклонения до 0.360 градусов вы циклически проходите через радианы с шагом 0..2PI.


107
Обратите внимание, что это aдолжно быть в радианах - это было действительно трудно для меня, как для начинающего, понять.
Ян

13
Я пытался вывести это уравнение в течение часа. Спасибо. Кто знает триггеры, которые вы узнали в старшей школе, был бы очень полезен.
Исиома Ннодум

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
Предварительно вычислите коэффициент преобразования, чтобы было меньше шансов неправильно ввести преобразование с использованием жестко закодированных чисел.
Скотти Т

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, если вы уже знаете, что такое комплексное число. Вероятно, это не так эффективно по скорости, как, скажем, реализация sin как справочной таблицы, но иногда вы используете комплексные числа для представления точек, чтобы использовать другие их свойства. Подобно использованию кватернионов для трехмерных вращений, на самом деле это не скорость, а возможности, которые они вам дают.
Пит Киркхам,

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.