Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Радиус из угла длин хорд |
Автор: wowka19 15.5.2014, 01:51 |
Есть ломанная линия, отрезки которой являются хордами некой окружности. Известны длины всех хорд и центральный угол, который охватывает эти хорды. Как найти радиус? ![]() Дано: 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 |
Друзья, чем вы слушаете читаете? Мне нужно выразить R, а не угол. И формула ![]() Добавлено @ 08:58 вопрос остался |
Автор: mrgloom 15.5.2014, 09:39 |
если известен угол значит известен центр окружности? |
Автор: wowka19 15.5.2014, 10:29 |
нет. |
Автор: mrgloom 15.5.2014, 12:41 |
тогда интересно как вы получаете этот угол, ведь тогда точка центра может двигаться и угол соответственно тоже будет меняться. |
Автор: 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 | ||
Что-то я не понимаю. Есть формула в которой известно все, кроме радиуса. Решается любым численным методом на раз. Методов для решения уравнений с одним неизвестным море, а при такой простой формуле даже и Монте-Карло потянет без проблем ![]() Может можно и аналитически ее вывернуть, но я не настолько в этом силен, чтобы быстренько выдать решение. ЗЫ: Понятное дело, если отрезков очень уж много, то компу придется потрудиться чуть больше. Но, при большом числе отрезков, можно просто принять их сумму за длину дуги и посчитать радиус по школьной формуле без большой ошибки. |
Автор: 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). |