У меня есть следующие 3D данные:
Сейчас я ищу простую функцию 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);
// -----------------------------------------------
У кого-нибудь есть идея, что я делаю не так?
Вы можете посмотреть в VXL ( http://public.kitware.com/vxl/doc/development/core/vgl/html/vgl__intersection_8h_source.html ), начиная со строки 00240, является объявлением функции, которую вы, вероятно, хотите. Это открытый исходный код, так что вы можете использовать библиотеку или просто загрузить и проверить код /
Мне не разрешено публиковать график. Вот описание графика:
точки прямоугольника: 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 находится снаружи, в противном случае он находится внутри.
Надеюсь, что это объяснение полезно для вас.