聪明小張 2023-10-22 13:16 采纳率: 0%
浏览 9

判断一个测试点是否在边界框内部

已知一个边界框的8个顶点,判断一个测试点是否在这个边界框的内部。有什么思路提点一下?

边界框为凸区域,8个顶点放在一个点向量中数据类型为 std::vector < Eigen::Vector3d > ; 测试点用一个三维向量表示,数据类型为Eigen::Vector3d ;

目前了解一些在二位图中的边界框区域判断,根据点在线段的哪一侧,点在所有边界框构成的线段的同一侧 -> 点在边界框外部 ;

  • 写回答

2条回答 默认 最新

  • m0_73571101 2023-10-22 14:17
    关注

    对于3D空间中的凸边界框,可以利用类似于2D的方法来判断点是否在边界框内部。具体来说,可以通过以下步骤实现:

    1. 平面方程:对于边界框的每一个面,你可以得到该面的平面方程。给定3个非共线的点(P_1(x_1, y_1, z_1)), (P_2(x_2, y_2, z_2)) 和 (P_3(x_3, y_3, z_3)),平面方程可以表示为:
      [a(x - x_1) + b(y - y_1) + c(z - z_1) = 0]
      其中:
      [a = (y_2 - y_1)(z_3 - z_1) - (z_2 - z_1)(y_3 - y_1)]
      [b = (z_2 - z_1)(x_3 - x_1) - (x_2 - x_1)(z_3 - z_1)]
      [c = (x_2 - x_1)(y_3 - y_1) - (y_2 - y_1)(x_3 - x_1)]

    2. 点与平面的位置关系:对于给定的测试点(T(x, y, z)),将它代入到上述的平面方程中,你可以判断点是在平面的正面、背面还是恰好在平面上。正值代表点在平面的一侧,负值代表点在平面的另一侧,零则代表点在平面上。

    3. 遍历所有面:对于边界框的每一个面,都使用上述方法来判断测试点与平面的位置关系。如果测试点对于所有的面都在相同的一侧(例如都在正面),那么测试点就在边界框的内部。

    下面是一个简化版的代码框架来实现上述思路:

    bool isInside(const std::vector<Eigen::Vector3d>& vertices, const Eigen::Vector3d& testPoint) {
        for (int i = 0; i < 6; i++) {
            Eigen::Vector3d p1, p2, p3;
            // 根据i的值选择适当的3个顶点来表示边界框的一个面
            // 注意: 你需要自己定义这个选择逻辑
    
            Eigen::Vector3d normal = (p2 - p1).cross(p3 - p1);  // 计算面的法向量
            double d = normal.dot(p1);                          // 计算平面方程的d值
    
            if ((normal.dot(testPoint) - d) * (normal.dot(vertices[0]) - d) < 0) {
                // 测试点在该面的另一侧,因此它在边界框外部
                return false;
            }
        }
    
        // 测试点在所有面的同一侧,因此它在边界框内部
        return true;
    }
    

    这只是一个基本的框架,您可能需要根据实际情况进行调整。希望这可以帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 10月22日

悬赏问题

  • ¥20 这张图页脚大概具体代码该怎么写?
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥15 高通uboot 打印ubi init err 22