Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > Как построить дугу |
Автор: BOB4uK 21.7.2008, 11:56 |
Хелп! Есть задачка над которой ломаю голову целый месяц! Надо построить дугу любой степени вогнутости! Дается две точки(начало и конец дуги) и длина дуги, большая длины отрезка(кот образуют две точки)! Если длина дуги большая то может получиться пости круг. Если возможно то как сделать дугу не через окружность а через эллипс? |
Автор: xamloru 21.7.2008, 12:41 |
Методом деления пополам, точно можно найти наибольшее соответствие, чтобы точное соответствие, пока не знаю |
Автор: BOB4uK 21.7.2008, 13:53 |
смутно представляю себе этот метод если честно! |
Автор: xamloru 21.7.2008, 14:25 |
значит так, нужно чтобы была написана функция, которая через две точки проводит дугу определенного радиуса, и считает ее длину. задача вполне решимая. далее мы меняем радиус, не очень большой(дуга получиться большая), и большой(дуга будет маленькая). далее делим к примеру большой радиус пополам, и сравниваем длину дуги с заданной, если она меньше, то радиус увеличиваем, если больше то уменьшаем(опять же делением пополам). таким образом мы можем найти приближение с заданной точностью. |
Автор: BOB4uK 21.7.2008, 16:51 |
вот пример того что должно получиться если длина дуги большая http://ipicture.ru/ |
Автор: xamloru 21.7.2008, 17:17 |
не опубликовалась твоя картинка |
Автор: BOB4uK 22.7.2008, 06:25 |
это сервер ipicture вчера тупил... картинка есть! |
Автор: Dobermann 22.7.2008, 06:51 |
Представь тогда, что получится из элипса... |
Автор: BOB4uK 22.7.2008, 07:52 |
вот что с элипсом должно получиться... http://ipicture.ru/ |
Автор: de_Nis 22.7.2008, 10:20 |
Дано: координаты двух точек, длина дуги. Обозначим точки буквами А и Б, длину дуги ДД. Представим, что АБ - диаметр искомой окружности. Тогда дуга, ограниченная этими точками, должна быть равна половине длины окружности диаметром АВ. Вычисляем и сравниваем с заданным размером дуги. Если вычисленное значение БОЛЬШЕ заданного - это не наш случай. А вот если МЕНЬШЕ заданного значения длины дуги ДД - продолжаем расчет. Обозначим центральный угол (меньший из углов, образованных радиусами, проведенными из точек А и Б) буквой а (в градусах), радиус искомой окружности R. Длина отрезка АВ известна (так как известны координаты точек А и Б). С другой стороны, это хорда, стягивающая угол а в нашей окружности. Длина хорды равна 2*R*Sin(а/2)=АВ Длина дуги, равная ДД, равна Pi*R*(360-a)/180 = ДД. Получается система двух уравнений с двумя неизвестными (радиус R и центральный угол а): 2*R*Sin(а/2)=АВ Pi*R*(360-a)/180 = ДД после решения которой можно определить радиус искомой окружности. |
Автор: Dobermann 22.7.2008, 10:41 |
Да, но ты хорошо выбрал часть!!! А если по нижней хорде?!?!?! |
Автор: de_Nis 22.7.2008, 12:39 |
Когда я написал "... Если вычисленное значение БОЛЬШЕ заданного - это не наш случай...", я имел в виду, что в этом случае вид дуги не соответствует рисунку BOB4uKа |
Автор: BOB4uK 22.7.2008, 13:04 |
Да уж! я скланяюсь к тому что в случае с эллипсом дугу не построить, знаний маловато! А вот с окружностью можно покумекать! Добавлено через 8 минут и 30 секунд мне щас интересно как можно узнать высоту зная только длину дуги и отрезок? http://ipicture.ru/ и как можно узнать длину дуги зная только высоту и длину отрезка? http://ipicture.ru/ |
Автор: BOB4uK 22.7.2008, 14:08 |
Вроди методом тыка нашел формулы как найти одно из другого! Прошу оценки и вероятности сбоя! h=(sqrt((L2/2)*(L2/2)-(L1/2)*(L1/2)))/1.11, где 1,11 это 11% разницы между половиной дуги и высотой! L2=sqrt(h*h+(L1/2)*(L1/2)); L2=L2+L2*0.11; L2=L2*2; |
Автор: Dobermann 22.7.2008, 14:16 |
А вот здесь не понятно... |
Автор: BOB4uK 22.7.2008, 14:51 |
вот смотри дуга 314, пол дуги 157, а высота в нашем примере извесна 100! следовательно а=100(L1/2=100? L1=200), b=100 - высота -> c=141 141*0,11+141=157, чтобы найти 141 мы 157/1,11! |
Автор: 4d5a 22.7.2008, 14:53 | ||
de_Nis,
только вот эта система не имеет аналитического решения (по крайней мере я его не знаю) А в радианах там проще считать : | AB=2*R*sin(a/2) { | LL=R*a (где LL есть ДД a-угол [рад] AB-хорда ) после подстановки AB=2*R*sin( LL/(2*R) ) А это вид a/x=Sin b/x, только численно! конечно его можно решить методом хорд или деления пополам, но думаю вначале эту функцию нужно проинтерполировать какой нибудь более простой для вычислений, например полиномом, а затем уже искать корни. (возможно это уменьшит вычислительные затраты ?) ЗЫ кстати вот здесь формулы по элементарной геометрии, кому надо ) http://www.bymath.net/studyguide/geo/sec/geo10.htm http://calc.ru/105.html |
Автор: BOB4uK 23.7.2008, 10:19 |
Я нашел формулу для нахождения длины дуги зная высоту и радиус! одну часть задачи решил спасибо 4d5a за ссылку! Вот осталось найти высоту по длине дуги и хорде! то что я писал с 0,11 не катит! при малой дуге не срабатывает! У кого каке мысли по этому поводу? |
Автор: BOB4uK 23.7.2008, 11:38 |
Я нашел формулу для нахождения длины дуги зная высоту и радиус! одну часть задачи решил спасибо 4d5a за ссылку! Вот осталось найти высоту по длине дуги и хорде! то что я писал с 0,11 не катит! при малой дуге не срабатывает! У кого каке мысли по этому поводу? |
Автор: de_Nis 23.7.2008, 12:26 |
Длина дуги (приблизительно) = квадратный корень из (хорда в квадрате +5,3333... *высота в квадрате), отсюда можно найти высоту ( Анурьев, Справочник конструктора - машиностроителя, т.1) |
Автор: BOB4uK 23.7.2008, 16:49 | ||
Спасибо большое! Точность на много больше чем у меня ![]() Я думаю тему можно считать закрытой! Всем спасибо за помощь! |