Сообщество программистов Autodesk в СНГ

Статьи => Тестирование статей => Тема начата: Дмитрий Загорулькин от 02-06-2017, 17:26:49

Название: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Дмитрий Загорулькин от 02-06-2017, 17:26:49
Вопрос:
При построении дуговых элементов в качестве одного из параметров часто требуется указать кривизну дуги (bulge). В справочной информации AutoCAD .NET API указано:
Определение №1: Кривизна - это тангенс 1/4 центрального угла дуги (центральный угол дуги - α).
В различных других источниках можно найти дополнительные определения:
Определение №2: Кривизна - это отношение высоты сегмента дуги к половине длины его хорды (высота сегмента - h, длина хорды - d). Например, тут (https://knowledge.autodesk.com/support/autocad-map-3d/learn-explore/caas/CloudHelp/cloudhelp/2016/ENU/MAP3D-Use/files/GUID-E04B543E-29E7-4545-A4FA-DDDF861E4960-htm.html).
Определение №3: Кривизна - это тангенс угла, образуемого отрезками (угол β): первый - от середины дуги к ее начальной (или конечной) точке, второй - от начальной до конечной точки дуги. Например, тут (https://cadsofttools.com/help/cadeditorx/index.html?draw_menu_polyline.htm).
Какое из дополнительных определений соответствует истине и может применяться для вычисления кривизны дуги?

(https://i.postimg.cc/pyY1WZtp/Bulge1.png) (https://postimg.cc/pyY1WZtp)

Ответ:
Определение №2 и Определение №3 являются геометрически эквивалентными, т.к. tg(β) = h / (0.5 x d). Осталось выяснить, какая зависимость между углами α и β. Для этого выполним дополнительные построения:

(https://i.postimg.cc/sQSnkP39/Bulge2.png) (https://postimg.cc/sQSnkP39)

Рассмотрим сперва треугольник OMC. Он прямоугольный, с двумя острыми углами: α/2 и γ. Отсюда получаем, что γ = 90° - α/2.
Далее, рассмотрим треугольник OBC. Он равнобедренный, с тремя углами: α/2 и β+γ = δ. Отсюда получаем, что (180° - α/2) / 2 = β+γ, следовательно: γ = 90° - α/4 - β.
Теперь, объединим эти два равенства:  90° - α/2 = 90° - α/4 - β. Отсюда получаем, что β = α/4, то есть, угол β равен четверти центрального угла дуги. А это как раз то, о чем идет речь в Определении №1.
Следовательно, оба дополнительных определения являются верными и для расчета кривизны можно применять любое из трех, исходя из имеющихся данных.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Debalance от 08-06-2017, 15:51:23
Тема вычисления bulge (с разъяснением его геометрического смысла) уже довольно сильно "избита". В свое время я пользовался вот этой (http://www.afralisp.net/archive/lisp/Bulges1.htm), одной из ранних статей на просторах интернета. Мне кажется там всё довольно подробно "разжёвано", так что и добавить особо нечего...

P.S.
Я удивлён что в справочной информации существует так много трактовок одного понятия. Надо бы "причесать" документацию.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 08-06-2017, 15:56:14
Я удивлён что в справочной информации существует так много трактовок одного понятия. Надо бы "причесать" документацию.
В Autodesk'овской документации есть только одна трактовка - п.1 Причем эта трактовка проходит через несколько документов (в том числе и ObjectARX/AutoCAD .NET API/DXF)
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Debalance от 08-06-2017, 16:03:59
В Autodesk'овской документации есть только одна трактовка - п.1
Ну да, это я тоже отчётливо помню. Вот хотя бы здесь (https://knowledge.autodesk.com/search-result/caas/CloudHelp/cloudhelp/2018/ENU/OARX-RefGuide/files/OREF-AcDb2dVertex--bulge-html.html) можно посмотреть.
Тогда, спрашивается, откуда автор топика взял ещё два определения?
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 08-06-2017, 16:06:33
Тогда, спрашивается, откуда автор топика взял ещё два определения?
Он где-то написал, что другие источники - это источники Autodesk? Читаем внимательно:

В различных других источниках можно найти дополнительные определения:
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Debalance от 08-06-2017, 16:19:41
Он где-то написал, что другие источники - это источники Autodesk?
Я полагал что да, ибо про п.1 было сказано что это только в AutoCAD .NET API. Поэтому, (во избежание путаниц) надо бы приводить сразу ссылочки (это же не так трудно сделать). И потом, что это за источники? На сколько они надёжны? И стоит ли проверять их все и писать по этому поводу статьи?
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 08-06-2017, 16:22:52
И потом, что это за источники? На сколько они надёжны? И стоит ли проверять их все и писать по этому поводу статьи?
Стоит, так как Дмитрий Загорулькин доказал, что все эти определения эквиваленты и:
Следовательно, оба дополнительных определения являются верными и для расчета кривизны можно применять любое из трех, исходя из имеющихся данных.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Debalance от 08-06-2017, 16:27:48
... так как Дмитрий Загорулькин доказал ...
Я не ставлю под сомнение доказательство Дмитрий Загорулькин, я лишь прошу дополнить статью соответствующими ссылками на первоисточники.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Дмитрий Загорулькин от 08-06-2017, 17:24:53
дополнить статью соответствующими ссылками на первоисточники
Добавил.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Debalance от 09-06-2017, 13:07:16
Добавил.
Так получается, что это источник Autodesk!

Он где-то написал, что другие источники - это источники Autodesk?
Требую чтобы Ривилис дезавуировал свой вопрос.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 09-06-2017, 13:26:42
Так получается, что это источник Autodesk!
Это в терминах MAP 3D.
Требую чтобы Ривилис дезавуировал свой вопрос.
Щас! :)
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Дмитрий Загорулькин от 24-01-2018, 17:55:45
Сегодня тема получила продолжение. Понадобилось мне из имеющихся значений: начальная точка дуги, конечная точка дуги и кривизна (bulge) получить точку центра дуги. Довольно быстро поиск привёл меня на сайт Lee Mac'a. Есть у него хорошие функции на LISP для этого: http://www.lee-mac.com/bulgeconversion.html. Да вот беда - не всегда понятно как и откуда получены такие красивые и компактные формулы. Особенно меня смутили формулы получения радиуса вот на этой картинке:
(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fwww.lee-mac.com%2Flisp%2Fgifs%2FBulge2Arc2.png&hash=51c5ddc42e50af3a6c8b932cd859eb75)
Компактно и просто, никаких арктангенсов и прочей тригонометрии. Но откуда они взяты?
В конце статьи есть ссылка на теоретический материал: http://www.afralisp.net/archive/lisp/Bulges1.htm
Да, там тоже есть эта загадочная формула:
Radius of the arc can now be found with this formula:

r = ((c/2)2+s2)/2*s
Но опять же, непонятно, откуда она взялась? Возможно, что у них это всё было в школьной программе и является настолько очевидным, что не требует пояснения. Можно, конечно же, просто поверить на слово и взять её в использование. Но лучше разобраться и понять, откуда и как она получилась.
В этом поможет такая картинка:
(https://i.postimg.cc/YLFTrKkV/arcschema.png) (https://postimg.cc/YLFTrKkV)
Равенства, которые понадобятся:
1. R = h1 + h2
2. tg α = d/h2
3. tg β = h1/d
А теперь, самое интересное. Как мы уже знаем, α = 2β. Следовательно, tg α = tg 2β. А для тангенса двойного угла есть формула разложения:
(https://i.postimg.cc/PCLg5w49/tg2x.png) (https://postimages.org/)
Выводим из уравнений 2 и 3 значения h1 и h2, подставляем их в уравнение 1, раскладываем тангенс двойного угла, заменяем tg β = b, где b - кривизна дуги (bulge), а b = s/d, где s - высота сегмента (на моём рисунке - h1). Преобразуем, упрощаем. В итоге, получаем эти красивые формулы вычисления радиуса дуги.
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Sergey_K от 02-05-2019, 20:18:55
В Autodesk'овской документации есть только одна трактовка - п.1 Причем эта трактовка проходит через несколько документов (в том числе и ObjectARX/AutoCAD .NET API/DXF)

If bulgeFlag is Adesk::kTrue, then bulge is interpreted to be the maximum distance between the arc and the chord between the two input points. If bulgeFlag is Adesk::kFalse, then bulge is interpreted to be the tangent of 1/4 the included angle (tan(ang/4)), where ang is the angle of the arc segment between the two input points

http://docs.autodesk.com/ACDMAC/2013/ENU/ObjectARX%20Reference/index.html?frmname=topic&frmfile=%21%21OVERLOADED_set_AcGeCircArc2d.html
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 02-05-2019, 20:36:49
В Autodesk'овской документации есть только одна трактовка - п.1 Причем эта трактовка проходит через несколько документов (в том числе и ObjectARX/AutoCAD .NET API/DXF)

If bulgeFlag is Adesk::kTrue, then bulge is interpreted to be the maximum distance between the arc and the chord between the two input points. If bulgeFlag is Adesk::kFalse, then bulge is interpreted to be the tangent of 1/4 the included angle (tan(ang/4)), where ang is the angle of the arc segment between the two input points

http://docs.autodesk.com/ACDMAC/2013/ENU/ObjectARX%20Reference/index.html?frmname=topic&frmfile=%21%21OVERLOADED_set_AcGeCircArc2d.html

И?
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Sergey_K от 02-05-2019, 20:41:00
И?

И не одна  :o
Название: Re: AutoCAD API. Расчет кривизны дуги (bulge).
Отправлено: Александр Ривилис от 02-05-2019, 21:05:49
И?

И не одна  :o

Для примитивов AutoCAD интерпретация одна. В приведенном тобой контексте это в действительности вообще не кривизна (bulge) при bulgeFlag == Adesk::kTrue, так как кривизна не может определяться только расстоянием.