Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Радиус из угла длин хорд


Автор: wowka19 15.5.2014, 01:51
Есть ломанная линия, отрезки которой являются хордами некой окружности.
Известны длины всех хорд и центральный угол, который охватывает эти хорды.
Как найти радиус?

user posted image
Дано: w1,w2,...,wn и a
Найти: R

Автор: maxim1000 15.5.2014, 08:41
Решения одной закрытой формулой пока в голову не пришло, но численным методом несложно:

Зная длины отрезков и радиус, посчитать значение угла несложно. И зависимость эта будет монотонная (больше радиус - меньше угол).

Так что можно оценить диапазон возможных знацений радиуса и воспользоваться, например, бинарным поиском.

Для нижней оценки подойдёт ноль.

Для верхней можно оценить длину дуги - она не будет больше, чем в Пи раз больше длины полилинии. Эту оценку делим на угол - получаем верхнюю границу для радиуса.

Автор: Lipetsk 15.5.2014, 08:54
хорде Wi соответствует угол ai, такой, что
sin(ai/2)=Wi/2/R
т.е. нужно выразить R из выражения
a=sum(ai)=2*sum(arcsin(Wi/2/R))

Автор: wowka19 15.5.2014, 08:58
Цитата(Lipetsk @  15.5.2014,  08:54 Найти цитируемый пост)
a=sum(ai)=2*sum(arcsin(Wi/2/R)) 

Друзья, чем вы слушаете читаете? Мне нужно выразить R, а не угол. И формула user posted image  - мне давно известна, но для меня бесполезна, ибо нужен РАДИУС!!! а не угол.

Добавлено @ 08:58
вопрос остался

Автор: mrgloom 15.5.2014, 09:39
если известен угол значит известен центр окружности?

Автор: wowka19 15.5.2014, 10:29
нет.

Автор: mrgloom 15.5.2014, 12:41
тогда интересно как вы получаете этот угол, ведь тогда точка центра может двигаться и угол соответственно тоже будет меняться.

Автор: maxim1000 15.5.2014, 18:06
Цитата(wowka19 @  15.5.2014,  08:58 Найти цитируемый пост)
Друзья, чем вы слушаете читаете? Мне нужно выразить R, а не угол.


ну так в том ответе так и написано:

Цитата(Lipetsk @  15.5.2014,  08:54 Найти цитируемый пост)
т.е. нужно выразить R из выражения


в случае моего ответа: бинарный поиск - тоже способ посчитать R

Автор: wowka19 16.5.2014, 14:17
mrgloom, Угол я не получаю, я его задаю.

maxim1000, ну так выразите R.

Автор: mrgloom 19.5.2014, 09:57
можно представить ломанную как точки и использовать МНК.

google -> fit circle least squares

Автор: _Y_ 20.5.2014, 19:29
Цитата(wowka19 @ 15.5.2014,  08:58)
Мне нужно выразить R, а не угол. И формула user posted image  - мне давно известна, но для меня бесполезна, ибо нужен РАДИУС!!! а не угол.

Что-то я не понимаю.

 Есть формула в которой известно все, кроме радиуса. Решается любым численным методом на раз. Методов для решения уравнений с одним неизвестным море, а при такой простой формуле даже и Монте-Карло потянет без проблем smile 


Может можно и аналитически ее вывернуть, но я не настолько в этом силен, чтобы быстренько выдать решение.

ЗЫ: Понятное дело, если отрезков очень уж много, то компу придется потрудиться чуть больше. Но, при большом числе отрезков, можно просто принять их сумму за длину дуги и посчитать радиус по школьной формуле без большой ошибки.

Автор: Mirkes 21.5.2014, 12:47
Аналитически в действительных числах не решается. В комплексных формула получается в виде ряда определенного рекурентно, а потом этот ряд еще придется обращать. Думаю, что численное решение - наиболее быстрый путь.
Функция угла от радиуса является монотонно убывающей
Взять R=1 если a®<А (А- требуемый угол), то делим R на 2,  до тех пор пока неравенство сохраняется.
Если a®>А, то умножаем R на два, пока неравенство сохраняется.
Имеем два радиуса при меньшем верно a(R_1)>A, при большем a(R_2)<A
Далее, например, дихотомией. Должно сойтись довольно быстро.
В принципе, если считать что углы при каждой хорде достаточно малы, можно для определения стартовой точки воспользоваться оценкой sin(a)~a~arcsin(a).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)