Узнать точку пересечения полилинии и блока c#

Автор Тема: Узнать точку пересечения полилинии и блока c#  (Прочитано 26000 раз)

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

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
если только точка находиться в габаритах блока.

А как проверить что точка в габаритах блока?

Есть коллекция BoundingBox. Как проверить что точка попала в это параллелепипед

Код - C# [Выбрать]
  1. .Nearest(p, 300);
- это оно?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Есть коллекция BoundingBox. Как проверить что точка попала в это параллелепипед
Можно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.
Наверное это самый оптимальный и быстрый способ. Можно еще через BoundBlock3d, у которого есть метод Contains.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Можно чисто геометрически: x1 <= X <= x2, y1 <= Y <= y2, z1 <= Z <= z2. Тут X, Y, Z - координаты проверяемой точки. x1, y1, z1 - минимальная точка BoundingBox. x2, y2, z2 - максимальная точка BoundingBox.


Хотел уточнить на картинке Красным например объект. Его параллелепипед будет фиолетовым или голубым? Или вообще другой конфигурации?
Если фиолетовым, то зелёная точка попадёт мимо объекта по условиям x1 <= X <= x2, y1 <= Y <= y2 ?

Или я не прав?




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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Его параллелепипед будет фиолетовым или голубым?
А что у тебя фиолетовый и голубой - это параллелепипеды? BoundingBox - это прямоугольный параллелепипед, со сторонами параллельными осям координат: 
Прямоугольный параллелепипед — Википедия

В твоём случае:



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

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Кто ж знает. Иногда называют, что-то чем-то, а по факту это не соответствует определению.  Или соответствует, но не совсем. Поэтому я и предположил, что параллелепипед это просто контур, иначе не понятно. Я ищу находится ли точка в объекте, надо сравнивать с BoundingBox объекта. А получается зелёная точка попадает в BoundingBox, а в объекте она не находится.

В чём подвох.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В чём подвох.
Подвоха здесь никакого нет. В твоём случае задача совершенно другая. И вот когда ты сможешь сформулировать задачу - тогда станет понятно как её решать.
Пока же я догадываюсь (судя по картинке), что у тебя есть штриховка и тебе нужно определить попадает ли точка внутрь штриховки или нет. Такая задача решается другим способом. Нужно найти контур штриховки (если она без отверстий - внутренних контуров) и определить пересекает ли любой луч из точки контур штриховки или нет. Пересечений может быть несколько - если число пересечений нечетное, то точка внутри штриховки, если 0 или четное - вне штриховки. Это упрощенный вариант. Могут быть нюансы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн RevitTormentor

  • ADN OPEN
  • ***
  • Сообщений: 162
  • Карма: 6
Моя задача такая - быстро узнать входит ли любая точка из коллекции точек в контур любой полилинии из коллекции полилиний.

На стадии тестирования, когда точек мало и полилиний мало всё работает быстро с кодом с форума, называется вроде MakeCountur команда. Там или попала точка на контур или в контур или за контуром. Шикарно, но всё будет плохо, когда будет "реальный" рабочий файл.
Начал искать варианты: наткнулся Rtree и BoundingBox. И что получается Rtree прямоугольники, которые также могут быть не по границам полилинии, и BoundingBox также не по границам объекта.
Теперь получается надо сначала коллекцию Регионов создавать, а потом искать входит ли точка в эту коллекцию?
Наверное да.

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

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

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
просто определить принадлежность точки полигону - это очень дорогая операция, а принадлежность BoundingBox - дешёвая

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
просто определить принадлежность точки полигону - это очень дорогая операция
Если многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений. В ссылке описано как раз. Просто пускаете луч в одну сторону из точки - если пересек многоугольник четное число раз, значит точка снаружи, если нечетное - точка внутри

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Цитировать
Если многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений. В ссылке описано как раз. Просто пускаете луч в одну сторону из точки - если пересек многоугольник четное число раз, значит точка снаружи, если нечетное - точка внутри
надо определить пересечения со всеми гранями полигона - а если их миллион?
а определение принадлежности к BoundingBox - фиксированное количество логических операций!
тут O(n) против O(1)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
trir, зависит от задачи конечно-же. Например, для треугольника вариант с BoundingBox может дать ой какие неверные результаты. Причем, чуть ли не с 50% погрешностью.
А алгоритмическая сложность O(n) тут явно будет незаметна, на мой взгляд. Эти вычисления достаточно просты и происходят быстро

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
O(n) для одного полигона - умножь на количество полигонов
там разница набегает очень значительная

Цитировать
Например, для треугольника вариант с BoundingBox может дать ой какие неверные результаты. Причем, чуть ли не с 50% погрешностью.
так с помощью BoundingBox мы делаем лишь первичную фильтрацию, отсеиваем заведомо ложные варианты. А потом уже применяем нормальные проверки

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если многоугольник выпуклый, то определить принадлежность точки достаточно просто - Учёт числа пересечений.
Не важно выпуклый или не выпуклый.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение