Некорректное определение средней точки для сплайна

Автор Тема: Некорректное определение средней точки для сплайна  (Прочитано 17535 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Был удивлён (мягко скажем) "неточностью" вычисления средней точки для сплайна.
Создал чертёж с тремя сплайнами. Сплайны отличаются расположением и количеством управляемых точек (см. рисунок и чертёж во вложении):



После этого определяю средние точки (зелёные кружки). Гипотетически все сплайны должны иметь средние точки строго расположенные по вертикали, но это почему-то не так. Кстати, сам AutoCAD (согласно привязке) определяет их корректно (жёлтые кружки).

Метод определения точек классический:
Код - C++ [Выбрать]
  1. AcDbSpline* pSpline = AcDbSpline::cast(TmpEnt);
  2. if (pSpline != NULL)
  3. {
  4.         double StartParam;
  5.         double EndParam;
  6.         pSpline->getStartParam(StartParam);
  7.         pSpline->getEndParam(EndParam);
  8.  
  9.         AcGePoint3d MidPoint;
  10.         pSpline->getPointAtParam((StartParam + EndParam ) * 0.5, MidPoint);
  11. }
  12.  

Что не так?

P.S.
AutoCAD 2016

Отмечено как Решение Александр Ривилис 31-05-2018, 11:31:56

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Что не так?
Не так я думаю твоё предположение, что средняя точка находится в среднем параметре. Для получения средней точки однозначно нужно использовать AcDbCurve::getPointAtDist и использовать в качестве значения половину длины сплайна.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Не так я думаю твоё предположение ...
Это не совсем моё предположение, это скорее Ваше предложение. Как-то Вы писали о нахождении средней точки дуги. Я полагал, что для сплайнов данный метод также работает.
« Последнее редактирование: 12-06-2017, 17:59:31 от Debalance »

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
Для получения средней точки однозначно нужно использовать AcDbCurve::getPointAtDist ...
Да. Данный метод работает корректно. В связи с этим возникают вопросы:
1. Как быть с AcGe-кривыми? Там (если Вы помните) есть только работа с интервалами. Преобразовывать в AcDb-кривые?
2. Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривой (а то надоело быть слепым котёнком)?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Как быть с AcGe-кривыми? Там (если Вы помните) есть только работа с интервалами. Преобразовывать в AcDb-кривые?
Посмотри описание методов:

Код - C++ [Выбрать]
  1. double AcGeCurve3d::length(
  2.     double fromParam,
  3.     double toParam,
  4.     double tol = AcGeContext::gTol.equalPoint()
  5. );
  6.  
  7. double AcGeCurve3d::paramAtLength(
  8.     double datumParam,
  9.     double length,
  10.     Adesk::Boolean posParamDir = Adesk::kTrue,
  11.     double tol = AcGeContext::gTol.equalPoint()
  12. );
  13.  
Если не поможет, то придётся конвертировать в AcDb.
2. Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривой (а то надоело быть слепым котёнком)?
Нигде явно это не описано и для всех видов кривых параметры имеют свой смысл.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я полагал, что для сплайнов данный метод также работает.
Нет. В силу того что параметры у дуги линейные (от начального угла до конечного), а у сплайна нет. Если мне не изменяет память, то у сплайнов параметры определяются расстоянием между управляющими точками. Кстати, и для полилиний этот алгоритм бы не сработал, так как каждое целое значение параметра попадает на очередную вершину полилинии, а расстояние между вершинами может быть (и обычно бывает) разным.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
double AcGeCurve3d::paramAtLength
Про эту функцию я что-то подзабыл. Спасибо за напоминание.

так как каждое целое значение параметра попадает на очередную вершину полилинии
Да. До этого я уже сам дошёл...
Ну, и как я понимаю, у эллипса также как и у дуги параметр это - угол. Верно?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну, и как я понимаю, у эллипса также как и у дуги параметр это - угол. Верно?
Насколько я помню - да. Кстати, можешь воспользоваться ARXDBG-> Curve Test для тестирования:



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Цитировать
Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривой
в книжках

Оффлайн DebalanceАвтор темы

  • ADN Club
  • ****
  • Сообщений: 421
  • Карма: 16
    • Advanced software for AutoCAD
  • Skype: Debalance
в книжках
В этих книжках мы ничего не найдём про параметры ибо они (параметры) - суть внутренняя "фича" от Autodesk.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитировать
Где, вообще, можно найти подробную инфу про геометрическую суть параметров для каждого типа кривой
в книжках
Перечитывай вопрос. Как книга по сплайнам поможет для дуг, полилиний, etc.???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Цитировать
Как книга по сплайнам поможет для дуг, полилиний, etc.
для этого понадобятся другие книжки, например учебник по геометрии

Цитировать
В этих книжках мы ничего не найдём про параметры ибо они (параметры) - суть внутренняя "фича" от Autodesk.
эти "фичи" пишут люди которые читали эти книжки (если сами их и не написали)
Я сравнивал функции из книжки с AutoCAD'ом - 1 в 1

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
для этого понадобятся другие книжки, например учебник по геометрии
Еще раз. Как учебник геометрии поможет тебе догадаться, что целые значения параметров совпадают с вершинами полилинии? С таким же успехом можно было в качестве параметра полилинии использовать длину от начала полилинии. Или что в качестве параметра для круга и дуги используются углы?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Цитировать
что целые значения параметров совпадают с вершинами полилинии?
разве?

Цитировать
Или что в качестве параметра для круга и дуги используются углы?
The NURBS book, Глава 1, формула 1.1
параметрические формы уравнений есть в каждом хорошем учебнике геометрии, они конечно могут быть разные, но есть же канонические

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
разве?
Угу. Можешь проверить.
The NURBS book, Глава 1, формула 1.1
Самая важная мысль написана чуть ниже:
Цитировать
Thus parametric representation of curve is not unique
« Последнее редактирование: 22-06-2017, 11:28:21 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение