gpt4 book ai didi

c++ - 计算矩形是否与 C++ 3D 中的射线相交

转载 作者:行者123 更新时间:2023-11-28 06:46:51 24 4
gpt4 key购买 nike

我有以下 3D 数据:

  • 射线原点 (x, y, z)
  • 光线方向(x, y, z)
  • 四个矩形角 (x,y,z)

现在我正在寻找一个简单的 C++ 函数来计算矩形是否与射线相交。我不需要交点坐标,只需要一个“是/否” bool 值。我在谷歌上搜索了很多,但不幸的是我找不到任何适合我要求的简单功能。我希望我可以避免编写自己的函数,因为 vector 计算很久以前就出现了:-(!如果有人有想法,我将非常感谢您的帮助。

谢谢....

编辑:

感谢您的帮助。这正是我正在寻找的,但我对 vxl 库有疑问。首先,我下载并编译了源代码。然后,在测试库时,当我尝试创建具有三个 3D 点的平面时出现以下错误。

“ undefined reference `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);
}

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

我不知道问题出在哪里,因为具有三个 3D 点的构造函数在“”标题中可用。默认构造函数似乎可以正常工作。

部分头文件:

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

// 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);

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

有人知道我做错了什么吗?

最佳答案

我不允许发布图表。这是图表描述:

矩形点:V0、V1、V2、V3

光线来源:O

光线方向:Dir

表面法线:N^

P:矩形平面上的击中点。 (注意:可能在外面)

我。计算生命值 P:

N^ = ((V1 - V0) X (V3 -V0)).nomralize()。 X 是叉积; N^长度为1,表面法线。

Q = O - V0

H = Q * N^。 * 是点积; H为到矩形面的最短距离

Dproj = 目录 * (-N^); -N^ 表示还原 N

比例 = H/Dproj。

P = O + (Dir).nomralized() * 比例。 Dir 是归一化 vector 。

二。通过比较矩形区域和四个三角形区域来判断P是否在矩形内

三角形/矩形面积计算引用: http://en.wikipedia.org/wiki/Cross_product

a0 = ((V0 - P) X (V1 - P) ).length() * 0.5

a1 = ((V1 - P) X (V2 - P) ).length() * 0.5

a2 = ((V2 - P) X (V3 - P) ).length() * 0.5

a3 = ((V3 - P) X (V0 - P) ).length() * 0.5

Trec = ((V1 - V0) X (V3 - V0)).length()

if ( (a0+a1+a2+a3) > Trec ), P在外面,否则在里面。

希望这个解释对你有用。

关于c++ - 计算矩形是否与 C++ 3D 中的射线相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com