2010-09-13 4 views
2

Можно создать дубликат:
Circle line collision detectionВычисление угла от х, у координаты

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

Данные, которые я определяю для сегмента (-ов) дуги, являются тремя точками. Два из них - конечные точки, лежащие на окружности круга, а третья точка - центр этого круга.

До сих пор это то, что у меня есть:

Пусть (а, б) быть центральной точки окружности, пусть «г» радиус окружности, и (x1, y1), (x2, y2) - концы дуги, лежащие на окружности круга.

Следующие параметрические уравнения дают координаты x и y дуги. 't' - параметрическая переменная.

х = а + г * соз (т) у = Ь + г * Sin (т)

Чтобы создать отрезки от дуги, Я хотел бы пройти дугу в течение некоторого фиксированного соотношения ' t 'создания сегментов линии по пути, пока я не достиг конца дуги. Для этого я решил, что мне нужно будет найти начальный и конечный угол. Я начал бы идти дугой от начального угла и заканчивался под углом. Поскольку я знаю начальную и конечную точки, я решил, что могу использовать эти уравнения для решения этих углов. Ниже приведены мои уравнения для этого:

т = агссоз ((XA)/г)

или

т = acrcsin ((Yb)/г)

проблема в том, что диапазон значений, возвращаемых этими функциями (http://en.wikipedia.org/wiki/Inverse_trigonometric_function) ограничен, поэтому существует высокая вероятность того, что угол, который я ищу, не будет возвращен, поскольку эти функции являются многозначными: arcsin (0) = 0, но также arcsin (0) = π, arcsin (0) = 2π и т. Д.

Как получить точный угол (и), который я ищу? Или вы можете подумать о лучшем/другом способе достижения моей цели?

+0

Я редактировал заголовок вопроса, потому что кажется, что вы действительно спрашиваете, как вычислить углы, а проблема аппроксимации кривой с помощью сегментов линии - это просто контекст. –

+0

Конечные точки дуги и центр круга определяют любую из двух дуг (они дополняют друг друга, чтобы составить весь круг). как вы определяете, какая дуга имеет значение? – Jonathan

ответ

3

По крайней мере, ИМО, вы идете по этому неправильно. Линия имеет уравнение y=mx+b.Круг имеет уравнение x + y = r . Вы ищете точку, в которой x и y круга равны x и y линии. Вы можете это сделать, заменив уравнение mx+b на линию для уравнения y в круге, а затем решите, используя квадратичное уравнение.

Уравнения, связанные с этим, немного длинны, но довольно много веб-страниц (например, http://www.sonoma.edu/users/w/wilsonst/papers/geometry/circles/default.html) имеют их, и в этот момент это просто вопрос реализации уравнений как нескольких функций и подключения значений для вашего конкретного круг/линия. Решение, основанное на этих уравнениях, полностью исключает двусмысленность от использования тангенса arg.

+0

Согласен. Смотрите, где пересекаются линия и круг; если есть точка или точки, тогда проверьте, находятся ли они как на сегменте, так и на дуге. – erickson

+0

уравнение, цитируемое для круга, относится только к окружности, центрированной в начале координат. – Jonathan

+0

@ Jonathon: Правда, я не хотел, чтобы здесь было слишком сложно, идея заключалась в том, чтобы указать общую идею о том, как можно заменить другого, чтобы найти где (если где угодно) они равны. Однако на приведенной странице используется полное уравнение. –

4

Посмотрите на atan2 function, который должен существовать на любом языке программирования или математической библиотеке, которую вы используете. Он принимает два аргумента: координаты x и y точки (для вас: (x-a)/r и (y-b)/r) и возвращает угол в диапазоне от -π до + π.

1

Ваш псевдокод очень похож на Python. Если вы не против использования Python, я бы порекомендовал Shapely Library. Если вы просто хотите алгоритм, проверьте источник.

Объекты Shapely имеют методы «упрощения» и «пересечения».

Смежные вопросы