2009-05-08 5 views
185

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

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

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

Вряд ли, @Binary, так как он отправил ответ. Это один из ответов на вопросы (которые разрешены, согласно предыдущим сообщениям модераторов). Но, учитывая, что он уже ответил в http://stackoverflow.com/questions/674225/calculating-point-on-a-circles-circumference-from-angle-in-c, он, вероятно, лучше всего закрыт как обман. Языки, которые делают это, не будут такими разрозненными. – paxdiablo

+21

Я только что вошел, чтобы сказать это: вы, сэр (ладья), являются Jerk. Не у всех есть такой же уровень образования, как и у вас, но он все еще может кодироваться, поэтому нет, это не тривиальный вопрос о гольф-поле. Позор тебе. – Braineeee

ответ

468

parametric equation for a circle является

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

Где г это радиус, сх, су происхождение, и угол.

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

+74

Обратите внимание, что 'a' должно быть в радианах - это было очень трудно для меня, как новичок, чтобы понять. – ioanb7

+8

Я пытаюсь получить это уравнение в течение часа. Благодарю. Кто знает, какие тригонные личности вы узнали в старшей школе, было бы так полезно. –

+1

@Dean Нет необходимости в дополнительных скобках из-за приоритета оператора. Когда у вас есть '+' и '*' как в этих двух уравнениях и без каких-либо скобок, вы всегда отправляете '*' сначала, а затем для '+'. – rbaleksandar

43

Вот моя реализация в 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

Предварительно вычислите коэффициент преобразования, чтобы уменьшить вероятность неправильного преобразования с использованием жестко закодированных номеров. –

16

Кто нуждается в аккуратном, когда у вас есть complex numbers:

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

Как это работает? Как он сравнивает скорость? Почему это не используется чаще? –

+0

@ MarkA.Ropper как работают сложные числа? - найдите учебник по математике или перейдите из https://en.wikipedia.org/wiki/Euler%27s_identity, если вы уже знаете, что такое комплексное число. Вероятно, это не так эффективно по скорости, по сравнению с реализацией греха как справочной таблицы, но иногда вы используете сложные числа, чтобы представлять точки во всем, чтобы использовать другие свойства. Подобно использованию кватернионов для 3D-ротации, это не настоящая скорость, а возможности, которые они вам дают. –