Что не так?Не так я думаю твоё предположение, что средняя точка находится в среднем параметре. Для получения средней точки однозначно нужно использовать AcDbCurve::getPointAtDist и использовать в качестве значения половину длины сплайна.
Не так я думаю твоё предположение ...Это не совсем моё предположение, это скорее Ваше предложение. Как-то Вы писали о нахождении средней точки дуги (http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=24&TID=39019&MID=219933#message219933). Я полагал, что для сплайнов данный метод также работает.
Для получения средней точки однозначно нужно использовать AcDbCurve::getPointAtDist ...Да. Данный метод работает корректно. В связи с этим возникают вопросы:
1. Как быть с AcGe-кривыми? Там (если Вы помните) есть только работа с интервалами. Преобразовывать в AcDb-кривые?Посмотри описание методов:
2. Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривой (а то надоело быть слепым котёнком)?Нигде явно это не описано и для всех видов кривых параметры имеют свой смысл.
Я полагал, что для сплайнов данный метод также работает.Нет. В силу того что параметры у дуги линейные (от начального угла до конечного), а у сплайна нет. Если мне не изменяет память, то у сплайнов параметры определяются расстоянием между управляющими точками. Кстати, и для полилиний этот алгоритм бы не сработал, так как каждое целое значение параметра попадает на очередную вершину полилинии, а расстояние между вершинами может быть (и обычно бывает) разным.
double AcGeCurve3d::paramAtLengthПро эту функцию я что-то подзабыл. Спасибо за напоминание.
так как каждое целое значение параметра попадает на очередную вершину полилинииДа. До этого я уже сам дошёл...
Ну, и как я понимаю, у эллипса также как и у дуги параметр это - угол. Верно?Насколько я помню - да. Кстати, можешь воспользоваться ARXDBG-> Curve Test для тестирования:
Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривойв книжках (https://books.google.ru/books/about/The_NURBS_Book.html?id=7dqY5dyAwWkC&redir_esc=y)
в книжкахВ этих книжках мы ничего не найдём про параметры ибо они (параметры) - суть внутренняя "фича" от Autodesk.
Перечитывай вопрос. Как книга по сплайнам поможет для дуг, полилиний, etc.???ЦитироватьГде, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривойв книжках (https://books.google.ru/books/about/The_NURBS_Book.html?id=7dqY5dyAwWkC&redir_esc=y)
Как книга по сплайнам поможет для дуг, полилиний, etc.для этого понадобятся другие книжки, например учебник по геометрии
В этих книжках мы ничего не найдём про параметры ибо они (параметры) - суть внутренняя "фича" от Autodesk.эти "фичи" пишут люди которые читали эти книжки (если сами их и не написали)
для этого понадобятся другие книжки, например учебник по геометрииЕще раз. Как учебник геометрии поможет тебе догадаться, что целые значения параметров совпадают с вершинами полилинии? С таким же успехом можно было в качестве параметра полилинии использовать длину от начала полилинии. Или что в качестве параметра для круга и дуги используются углы?
что целые значения параметров совпадают с вершинами полилинии?разве?
Или что в качестве параметра для круга и дуги используются углы?The NURBS book, Глава 1, формула 1.1
разве?Угу. Можешь проверить.
The NURBS book, Глава 1, формула 1.1Самая важная мысль написана чуть ниже:
Thus parametric representation of curve is not unique
Но если держать под рукой нужные книжки, многие вещи выглядят очевиднымиЭто было бы очевидным, если бы разработчики AutoCAD в документации давали бы ссылки на главы в "нужных книжках". А в нынешней ситуации остаётся только ломать голову и догадываться: "так это или не так...?"
Кстати, можешь воспользоваться ARXDBG-> Curve Test для тестирования:Продолжая тестировать CurveTest у меня возник вопрос. В данной утилите есть два исполнения getClosestPointTo:
В моём случае getClosestPointTo (projected) даёт более точные результаты. Но мне не совсем понятно как программно реализуется данная функция (в отличии от просто getClosesstPointTo)?Читаем ObjectARX SDK Docs:
This function projects the curve onto the plane defined by givenPnt and normal, finds the point on the projected curve that is nearest to givenPnt, then projects this nearest point back onto the original curve and sets pointOnCurve to the result.Вопросы еще остались?
Вопросы еще остались?Увы да и много. Кластер вопросов вытекает опять же из темы связанной со сплайнами и функцией getClosestPointTo.
1. Это что уникальность сплайна?Допускаю, что может. Мы как-то на DWG.RU коллективно составляли метод, которые корректно определял бы BoundingBox для сплайна, т.к. стандартный метод возвращал некорректный результат: http://forum.dwg.ru/showthread.php?t=41621&highlight=%EF%E5%F7%E0%F2%FC&page=2 сообщения #24 - #52.
2. Может это быть глюком самого AutoCAD?
т.к. стандартный метод возвращал некорректный результатНу БаундингБокс это отдельная тема - он и для дуги выдаёт некорректные результаты (в своё время я с этим тоже накувыркался). А если это касается точки на кривой - то Автокаду грош цена как инженерной системе...
Погрешность определения точки в этом случае составляет около 0,01 ед.чертежаОткуда Вы взяли эту цифру?
Зачем Вам такая точность?Ну значит нужна. А что, это разве большая точность для точного машиностроения и для возможностей AutoCAD?
Если хотя бы в 10 раз увеличить - ближайшая точка корректно определяется.ХОТЯ БЫ В Д-Е-С-Я-Т-Ь?!!! То есть всё-таки глюк?
Откуда Вы взяли эту цифру?Измерил расстояние между полученной точкой и той, которую ожидалось получить.
Ну значит нужна. А что, это разве большая точность для точного машиностроения и для возможностей AutoCAD?Тогда, наверное, лучше сплайн не использовать. Видимо, у него есть искусственное ограничение по точности вычисления. Подозреваю, что это ввели специально, чтобы не страдало быстродействие.
Измерил расстояние между полученной точкой и той, которую ожидалось получить.Я предпочитаю измерять погрешность в процентах. И в данном случае погрешность составляет примерно 400%.
Тогда, наверное, лучше сплайн не использовать.Весьма жаль. В связи с этим область применения AutoCAD'а резко "скукоживается".
Подозреваю, что это ввели специально...Выходит движок AutoCAD весьма негибкий ибо не может приспосабливаться к масштабу чертежа.
Выходит движок AutoCAD весьма негибкий ибо не может приспосабливаться к масштабу чертежа.Мы не обсуждаем это на данном форуме. По существу у тебя только один выход - выполнять аппроксимацию сплайна и находить ближайшую точку к аппроксимирующей кривой.
Выходит движок AutoCAD весьма негибкий ибо не может приспосабливаться к масштабу чертежа.Немного не так. Механизм сплайнов в AutoCAD не позволяет их использовать в нанотехнологиях :) Но с другими объектами все не так уж и плохо. В .NET API у сплайна есть метод ToPolylineWithPrecision. С его помощью можно получить нужную точку (переписать на C++ думаю не будет проблемой):
Мы не обсуждаем это на данном форуме.А между тем это ключевая тема для любого программиста. Мы должны чётко понимать исходные возможности среды. Где я могу получить информацию о допусках при работе со сплайнами? И правильно ли я понял из Вашей безапелляционной тезы (что у меня всего лишь один выход), что это не является багом движка AutoCAD, а всего лишь изначально заложенное ограничение?
Механизм сплайнов в AutoCAD не позволяет их использовать в нанотехнологияхЭто Ваше предположение? К тому же насколько я помню нанотехнологии начинаются после точностей 0.000000001 ед.
В .NET API у сплайна есть метод ToPolylineWithPrecisionРивилис уже предложил аппроксимировать, а это одно и тоже. Рудиментарный метод - вместо математической модели я буду хранить кучу точек с посредственной для "нанотехнологий" точностью.
И правильно ли я понял из Вашей безапелляционной тезы (что у меня всего лишь один выход), что это не является багом движка AutoCAD, а всего лишь изначально заложенное ограничение?Ты можешь считать как хочешь, но факт остаётся фактом - исправлять это не будут, т.к. это значительно ухудшит скорость работы со сплайнами.
Рудиментарный метод - вместо математической модели я буду хранить кучу точек с посредственной для "нанотехнологий" точностью.Нет формулы, которая позволила бы найти ближайшую точку на сплайне по характеристикам сплайна. Отсюда я вижу единственный способ - аппроксимацию.
Ты можешь считать как хочешь...Безусловно, но это меня как-то мало бодрит.
... исправлять это не будут.Исправляют обычно ошибки и баги, а если это ни то ни другое, то обчём речь?
... т.к. это значительно ухудшит скорость работы со сплайнами.Ну хорошо, ну тогда должен существовать некий точностной критерий абсолютной длины сплайна после которго все методы функционируют без сбоя?
Нет формулы, которая позволила бы найти ближайшую точку на сплайне по характеристикам сплайна.Вы хотите сказать метод getСlosestPointTo использует принцип предварительной аппроксимации сплайна?
Вы хотите сказать метод getСlosestPointTo использует принцип предварительной аппроксимации сплайна?Если бы использовал, то ты бы получил правильную точку. Я так думаю.
А как быть с точкой пересечения? Тоже нет формулы?Думаю что в общем случае нет.
Исправляют обычно ошибки и баги, а если это ни то ни другое, то обчём речь?Это и то и другое. :) Кстати по поводу BoundingBox для сплайна на старом сайте ADN была статья: http://jprdintprev.autodesk.com/adn/servlet/devnote?siteID=4814862&id=5410164&linkID=4900509
Кстати по поводу BoundingBox для сплайна на старом сайте ADN была статьяСовершить миллион итераций?!!! Какое неэлегантное решение... Я разочарован в креативности программистов из AutoDesk.
Совершить миллион итераций?!!! Какое неэлегантное решение...С этим я, пожалуй, соглашусь. Мне оно тоже не по душе.
Я разочарован в креативности программистов из AutoDesk.Этих людей очень условно можно назвать "программисты из Autodesk", т.к. это специалисты техподдержки ADN. Там довольно толковые ребята, но ввиду широкой области их задач и, вследствие этого, большой загруженности, не стоит рассчитывать на их высокую "креативность".
Совершить миллион итераций?!!! Какое неэлегантное решение... Я разочарован в креативности программистов из AutoDesk.Это не код, работающий в AutoCAD, а лишь пример того, как можно получить более точно BoundingBox. Там в коде есть еще более нелогичные вещи типа:
... код на сайте просто демонстрирует идею ...Ну если "идея" этих ста пятидесяти строчек кода заключена в том, чтобы научить юзера неуклюже пользоваться методом getPointAtParam, то я (по мимо обозначенного выше) разачарован также и в общей концепции приподнесения обучающего материала в ADN.
Данный форум (на фоне такого примера из "Базы Знаний" ADN) выглядит намного более креативным. Это просто кладезь фонтанирующий элегантными идеями.Спасибо за высокую оценку данного форума. Кстати, многие мои ответы - это "креативно" переработанные примеры из базы знаний ADN. Самое существенное в этих примерах - это идея, а всё остальное можно и самостоятельно реализовать.
Спасибо за высокую оценку...Ну что Вы! Это роскошество с вашей стороны. Спасибо - это слишком много. Мне бы хватило маленького плюса в карму за этот пост...
Кстати, многие мои ответы - это "креативно" переработанные примеры...Да, это заметно. Надеюсь, что Ваше начальство также по достоинству ценит Ваш труд.
Ну что Вы! Это роскошество с вашей стороны. Спасибо - это слишком много. Мне бы хватило маленького плюса в карму за этот пост...Уговорил. :)