Вычислить, если прямоугольник пересекается с лучом в C ++ 3D

У меня есть следующие 3D данные:

  • происхождение луча (x, y, z)
  • направление луча (x, y, z)
  • четыре прямоугольных угла (x, y, z)

Сейчас я ищу простую функцию c ++, которая вычисляет, пересекает ли прямоугольник луч. Мне не нужны координаты пересечения, только бул «да / нет».
Я много гуглил, но, к сожалению, не могу найти ни одной простой функции, соответствующей моим требованиям. Я надеюсь, что смогу избежать написания своей собственной функции, потому что вычисление векторов уже давно пришло на свет :-(! Если у кого-то есть идея, я рад любой помощи.

Спасибо….

Редактировать:

Спасибо за вашу помощь. Это именно то, что я ищу, но у меня проблема с библиотекой vxl. Сначала я скачал и скомпилировал источники. Затем при тестировании библиотеки я получил следующую ошибку при попытке создать плоскость с тремя трехмерными точками.

«неопределенная ссылка на` vgl_plane_3d :: vgl_plane_3d (vgl_point_3d const&, vgl_point_3d const&, vgl_point_3d const&) ‘|»

Мой код:

// -----------------------------------------------
#include <vgl/vgl_point_3d.h>
#include <vgl/vgl_plane_3d.h>
#include <vgl/vgl_intersection.h>

void createTestPlane(void);

using namespace std;

int main()
{
createTestPlane();
return 0;
}

void createTestPlane()
{
vgl_point_3d<double> PlaneP0(1.0,0.0,0.0);
vgl_point_3d<double> PlaneP1(1.0,0.0,1.0);
vgl_point_3d<double> PlaneP2(1.0,1.0,0.0);
vgl_plane_3d<double> testConstruction();
vgl_plane_3d<double> Plane(PlaneP0,PlaneP1,PlaneP2);
}

// -----------------------------------------------

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

Часть заголовочного файла:

// -----------------------------------------------

// Default constructor: horizontal XY-plane (equation 1.z = 0)
inline vgl_plane_3d () : a_(0), b_(0), c_(1), d_(0) {}

//: Construct from three non-collinear points
//  The plane will contain all three points \a p1, \a p2 and \a p3.
vgl_plane_3d (vgl_point_3d<T> const& p1,
vgl_point_3d<T> const& p2,
vgl_point_3d<T> const& p3);

// -----------------------------------------------

У кого-нибудь есть идея, что я делаю не так?

0

Решение

Вы можете посмотреть в VXL ( http://public.kitware.com/vxl/doc/development/core/vgl/html/vgl__intersection_8h_source.html ), начиная со строки 00240, является объявлением функции, которую вы, вероятно, хотите. Это открытый исходный код, так что вы можете использовать библиотеку или просто загрузить и проверить код /

0

Другие решения

Мне не разрешено публиковать график. Вот описание графика:

точки прямоугольника: V0, V1, V2, V3

происхождение луча: O

направление луча: Dir

нормальная поверхность: N ^

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

I. вычислить точку попадания P:

N ^ = ((V1 — V0) X (V3 -V0)). Nomralize (). Х является перекрестным произведением; N ^ длина равна 1, поверхность нормальная.

Q = O — V0

H = Q * N ^. * является точечным произведением; H — кратчайшее расстояние до прямоугольной поверхности

Dproj = Dir * (-N ^); -N ^ означает вернуть N

Scale = H / Dproj.

P = O + (Dir) .nomralized () * Масштаб. Dir — нормализованный вектор.

II. проверить, находится ли P внутри прямоугольника, сравнивая прямоугольную область и четыре треугольных области

Справка о вычислении площади треугольника / прямоугольника:
http://en.wikipedia.org/wiki/Cross_product

a0 = ((V0 — P) X (V1 — P)). длина () * 0,5

a1 = ((V1 — P) X (V2 — P)). длина () * 0,5

a2 = ((V2-P) X (V3-P)). длина () * 0,5

a3 = ((V3-P) X (V0-P)). длина () * 0,5

Trec = ((V1 — V0) X (V3 — V0)). Длина ()

если ((a0 + a1 + a2 + a3)> Trec), P находится снаружи, в противном случае он находится внутри.

Надеюсь, что это объяснение полезно для вас.

0

По вопросам рекламы [email protected]