Как рассечь замкнутый сплайн?

Автор Тема: Как рассечь замкнутый сплайн?  (Прочитано 1438 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Имеем в активе сплайн AcGeNurbCurve2d с атрибутом Closed. Необходимо рассечь данный объект по двум точкам (или параметрам). Как я понимаю метод AcGeCurve2d::getSplitCurves применим только к незамкнутым кривым. А как быть в данном случае?

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #1 : 16-04-2017, 17:21:53 »
Как я понимаю метод AcGeCurve2d::getSplitCurves применим только к незамкнутым кривым.
Почему ты так решил?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #2 : 16-04-2017, 17:24:59 »
Почему ты так решил?
Ну как же... логично предположить, что одной точкой мы не разделим такой объект на два...

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #3 : 16-04-2017, 17:26:27 »
Почему ты так решил?
Ну как же... логично предположить, что одной точкой мы не разделим такой объект на два...
Ты попробовал?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #4 : 16-04-2017, 17:34:33 »
Ты попробовал?
Честно говоря нет. Но ведь такое невозможно сделать с помощью команды BREAK! Это меня и смутило. Кроме того в описании к методу по этому поводу ничего не сказано - там либо обе кривые NULL либо нет.


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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #5 : 16-04-2017, 18:03:57 »
Честно говоря нет.
Практика - критерий истины. У меня другая логика. У каждой кривой есть свой диапазон параметра. В данном случае эта функция делит кривую по заданному параметру param. Т.е. должны появится две кривые: [0, param] и [param, maxparam].
Если практика покажет, что это не так, то будем разбираться дальше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #6 : 16-04-2017, 18:18:34 »
[0, param] и [param, maxparam]
Ах вот оно что! По вашей логике получается, что последовательно деля окружность или эллипс двумя точками мы должны получить три объекта... Ну что же посмотрим...

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #7 : 04-05-2017, 11:15:05 »
В продолжении темы о рассечении сплайна хотелось бы задать вот такой вопрос: имеем сплайн с атрибутом "self-intersecting", ну например вот такой:



Возникает задача о "расщеплении" такого сплайна в точке взаимного пересечения. Для себя вижу пока одно решение так сказать "с ходу": разбить сплайн на несколько частей и  проверить пересечение каждого под-сплайна друг с другом... Таким образом находится точка пересечения. Но как-то это "коряво" и есть дальнейшие трудности... Может будут ещё "светлые" идеи...?

Оффлайн Николай Горлов

  • ADN
  • *
  • Сообщений: 164
  • Карма: 14
Re: Как рассечь замкнутый сплайн?
« Ответ #8 : 04-05-2017, 11:35:57 »
ну, сплайн разбить придется не на несколько частей, а на ооооочень много частей (грубо говоря - на отрезки или дуги из которых он собственно говоря и состоит на самом деле). а потом да, искать пересечения каждого отрезка со всеми остальными. и это даст ВСЕ точки самопересечения.

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #9 : 04-05-2017, 11:44:45 »
ну, сплайн разбить придется не на несколько частей, а на ооооочень много частей
Это зачем?  Если использую метод AcGeCurve2d::getSplitCurves, то данный сплайн достаточно разбить на 3...4 части равной длины. А Вы я так полагаю хотите использовать кусочно-линейную аппроксимацию? Ну это не точный метод и весьма громоздкий в плане вычисления...

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #10 : 04-05-2017, 11:49:36 »
Увы, но подозреваю, что другого решения нет.
Как вариант - аппроксимация сплайна и использование AcDbMPolygon::loopCrossesMPolygon для получения точек пересечения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #11 : 04-05-2017, 11:50:59 »
Если использую метод AcGeCurve2d::getSplitCurves, то данный сплайн достаточно разбить на 3...4 части равной длины.
А какая гарантия, то точка самопересечения не окажется внутри одного из кусков и попарное пересечение ничего не даст?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 215
  • Карма: 4
  • Баллы: 7548
    • Advanced software for AutoCAD
  • Skype: Debalance
Re: Как рассечь замкнутый сплайн?
« Ответ #12 : 04-05-2017, 11:55:57 »
Увы, но подозреваю, что другого решения нет.
Хорошо, допустим нашел я точку взаимного пересечения, а как мне определить ДВА параметра на исходной кривой соответствующие этой одной точке?

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #13 : 04-05-2017, 11:56:20 »
На сколько частей нужно разбить этот сплайн, чтобы гарантировано найти точки самопересечения:



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

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

  • Administrator
  • *****
  • Сообщений: 6815
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как рассечь замкнутый сплайн?
« Ответ #14 : 04-05-2017, 11:57:42 »
Хорошо, допустим нашел я точку взаимного пересечения, а как мне определить ДВА параметра на исходной кривой соответствующие этой одной точке?
Однозначно готового простого алгоритма для этого нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение