Определение внуренних и внешних углов в контуре

Автор Тема: Определение внуренних и внешних углов в контуре  (Прочитано 30309 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Добрый день!
Подскажите, есть ли возможность определить тип угла в контуре - внешний он или внутренний?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я вот сейчас ничего не понял)
Контур - это замкнутая полилиния? Тогда что такое внешний угол и внутренний угол? Я вот чисто из геометрии рассуждаю - в замкнутом контуре у нас есть только острый и тупой угол. И все они внутри!
Уточните вопрос, пожалуйста - о чем речь вообще

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
1) Да контур - замкнутая полилиния
2)


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Как я и сказал - это острый угол и тупой. Первый <=90 градусов, второй > 90 градусов. Обычная геометрия
Если касаемо программы - просто проходите по сегментам полилинии и меряете угол между ними. Только вот есть куча нюансов: три типа полилинии, у которых разные методы работы и дуговые сегменты (хотя дуговые сегменты, думаю, не проблема)

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Возможно, имеется в виду, угол "поворачивает" "внутрь" контура, или "наружу". Человек, небось, решает какой-нибудь convex hull, или что-то подобное..
Алексей

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Человек, небось, решает какой-нибудь convex hull, или что-то подобное..
Человек ждет, когда ему готовое решение напишут. Знаю по прошлым темам  ;) ;D

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Кстати, вот тут есть пояснение, что такое внешние и внутренние углы. Но мы не знаем, что топик-стартер хотел на самом деле.
Алексей

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Я так понимаю мне надо использовать GetLineSegmentAt()?
И нет я не жду готовое решение, пытаюсь разобраться сам.))) И прошу не давать готовый код)

Поправьте если буду не прав:
1) выбираем контур Autodesk.AutoCAD.EditorInput.Editor.GetSelection
2) Получаем количество вершин Autodesk.AutoCAD.DatabaseServices.Polyline.NumberOfVertices
3) В цикле от 0 до Autodesk.AutoCAD.DatabaseServices.Polyline.NumberOfVertices получаем сегменты контура
4) Считаем угол между сегментами

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Наконец-то посмотрел на картинку.
Я в этом случае делал так:
1. Три вершины смежных сегментов образуют треугольник.
2. Берём точку внутри этого треугольника (например, какую-нибудь характерную)
3. И определяем - внутри многоугольника эта точка, или снаружи. Задача о попадании точки внутрь многоугольника - легка. Если хотим самостоятельной работы - гуглится тоже легко (кстати, советую ресурс - там много хороших алгоритмов описано).
UPD: Правда, я работал не с автокадовскими кривыми, по-этому решал чисто геометрически.
Алексей

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я так понимаю мне надо использовать GetLineSegmentAt()?
Если у вас полилиния является объектом Polyline, то да - вам подойдут:
Код - C# [Выбрать]
  1. lwp.GetArcSegment2dAt(int index);
  2. lwp.GetArcSegmentAt(int index);
  3. lwp.GetLineSegment2dAt(int index);
  4. lwp.GetLineSegmentAt(int index);
где index - номер вершины.
Итерацию по вершинам:
Код - C# [Выбрать]
  1. for (var i = 0; i < pline.NumberOfVertices; i++)
  2. {
  3. }

Если у вас Polyline2d или Polyline3d, то там другие методы работы (сам еще не знаю какие)

Все остальные манипуляции - геометрия и математика =)

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Я так понимаю мне надо использовать GetLineSegmentAt()?
Если у вас полилиния является объектом Polyline, то да - вам подойдут:
Код - C# [Выбрать]
  1. lwp.GetArcSegment2dAt(int index);
  2. lwp.GetArcSegmentAt(int index);
  3. lwp.GetLineSegment2dAt(int index);
  4. lwp.GetLineSegmentAt(int index);
где index - номер вершины.
Итерацию по вершинам:
Код - C# [Выбрать]
  1. for (var i = 0; i < pline.NumberOfVertices; i++)
  2. {
  3. }

Если у вас Polyline2d или Polyline3d, то там другие методы работы (сам еще не знаю какие)

Все остальные манипуляции - геометрия и математика =)

Долго писал я, но видимо в правильном направлении.

Командой (entget(car(entsel))) выводит, что у меня контуры LWPOLYLINE. То есть мне подходит GetLineSegmentAt();?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
То есть мне подходит GetLineSegmentAt();?
Ну тогда да - это ваш случай. Только нужно еще проверить, что это именно прямолинейный участок. Для этого подойдет метод GetBulge(int index) - если 0, значит прямолинейный

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Предлагаю простейший способ:
1) Получаем площадь полилинии S1.
2) Удаляем угловую вершину и получаем площадь полученной полилинии S2.
3) Сравниваем площади. Если S1 < S2 - угол внешний, S1 > S2 - внутренний, S1 == S2 - три точки на одной прямой.
4) Отменяю транзакцию (ну или восстанавливаю вершину).

Метод оказался заманчивым, но не универсальным.
« Последнее редактирование: 08-11-2015, 00:13:59 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Александр Ривилис, изящно! ))

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

  • ADN OPEN
  • **
  • Сообщений: 59
  • Карма: 0
Предлагаю простейший способ:
1) Получаем площадь полилинии S1.
2) Удаляем угловую вершину и получаем площадь полученной полилинии S2.
3) Сравниваем площади. Если S1 < S2 - угол внешний, S1 > S2 - внутренний, S1 == S2 - три точки на одной прямой.
4) Отменяю транзакцию (ну или восстанавливаю вершину).
Прошу прощения, но я как то не понял данного метода)
Площадь полилинии? Она же вроде =0, или я что то не понимаю(если это просто прямая)? Я однозначно чего то не понимаю....


Ааааааа, то есть удалив вершину, соединяем предыдущую и следующие вершины, после измеряем площадь получившегося контура? Таким образом?