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


Автор: 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 @  21.7.2008,  16: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
Цитата(BOB4uK @  22.7.2008,  07:52 Найти цитируемый пост)
вот что с элипсом должно получиться...

Да, но ты хорошо выбрал часть!!! А если по нижней хорде?!?!?! 

Автор: 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,  15:08 Найти цитируемый пост)
 где 1,11 это 11% разницы между половиной дуги и высотой!

А вот здесь не понятно...

Автор: 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
Цитата(de_Nis @ 23.7.2008,  12:26)
Длина дуги (приблизительно) = квадратный корень из (хорда в квадрате +5,3333... *высота в квадрате), отсюда можно найти высоту
( Анурьев, Справочник конструктора - машиностроителя, т.1)

Спасибо большое! Точность на много больше чем у меня  smile 
Я думаю тему можно считать закрытой!

Всем спасибо за помощь!

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