Получить линию пересечения между двумя прямоугольниками в 3D - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь найти способ получить линию (две точки в трехмерном пространстве) пересечения между двумя прямоугольниками.

Я столкнулся с этим вопросом: Пересечение между двумя прямоугольниками в 3D

Но это не моя проблема.В этом вопросе прямоугольник рассматривается только как границы (периметр), в то время как я ищу прямоугольник в целом (подумайте о картинной рамке против самой картинки).

Я понялчто в каждом случае будет либо линия пересечения (две точки), либо пересечения вообще не будет.Если пересечение было только на границах, то есть просто точка, в моем случае это можно рассматривать как пересечение без *. 1009 *

Мой сценарий состоит в том, что один из этих прямоугольников представляет собой «статическую» поверхность, которая не может двигаться илименять.Другая представляет собой «динамическую» поверхность, которую я должен адаптировать, чтобы избежать пересечения

Пример:

enter image description here

Как только я получуp1 и p2, которые являются точками в трехмерном пространстве, моя цель состоит в том, чтобы преобразовать динамический прямоугольник в трехмерный многоугольник, который больше не будет пересекать статический прямоугольник, например:

enter image description here

Итак, вы можете понять, почему «пересечения краев» не имеют отношения к моей ситуации.Я превращаю «настоящие» пересечения в пересечения ребер, поэтому любое пересечение ребер не требует от меня ничего с этим делать.

Я только ищу формулу, начиная с двух наборов из 4 точек (прямоугольники), что даст мне две точки линии их пересечения или скажет, что пересечения нет (релевантного).

Каждая формула, найденная мной на этом сайте или другими, не подходитмои потребности, или я не могу вводить произвольные прямоугольники (например, я не могу решить мою проблему с помощью формулы, которая использует плоскости или обрабатывает прямоугольник как просто 4 строки)

Я, конечно,, пытаясь закодировать его (в C #), поэтому любой кодовый ответ является большой помощью, но я уверен, что даже математического ответа мне было бы достаточно, чтобы получить код из него, поэтому я приму ответ, который толькосоставлены из псевдокода или математических формул, если они либо достаточно просты, либо достаточно хорошо объяснены, чтобы я мог понять, что происходитИнж.

1 Ответ

0 голосов
/ 03 января 2019

Если все в порядке с алгоритмом, а не с полным кодом, вот набросок:

  1. Построить 2 плоскости из прямоугольников (любые 3 точки будут такими же, как в этом ответе )
  2. Найдите линию пересечения I этих двух плоскостей, как в этом ответе , или выясните, что плоскости параллельны, поэтому пересечения нет
  3. Найдите пересечения линии I с линиями, содержащими все стороны прямоугольников, как в этот ответ
  4. Проверьте, находятся ли некоторые точки, найденные на предыдущем шаге, внутри соответствующих сторон прямоугольников (отрезков). Этот шаг потенциально можно объединить с предыдущим, но я для простоты выделил его отдельно. Теперь у вас потенциально есть 0, 1 или 2 сегмента, которые представляют пересечения линии I с вашими двумя прямоугольниками (обратите внимание, что здесь точка рассматривается как случай ребра сегмента, где оба конца одинаковы). Если у вас нет 2 сегментов, пересечение прямоугольников отсутствует.
  5. Если на предыдущем шаге вы нашли 2 сегмента (по одному в каждом прямоугольнике) на линии I, вам просто нужно найти их пересечение, и это будет ваш ответ (опять же, пустое означает, что пересечения нет).
...