确定一个点是否在 3D 立方体中
Determine if a Point is in a 3D Cube
我需要最好的解决方案,如果可能的话,不是脏代码,而是一些智能代码。
我不熟悉3D编程。
我必须编写一个函数,如果一个点在 3D space (x, y, z) 中,它将 return。将提供 space 中立方体的范围(例如范围 { {1,2,1}, {5,6,4} })
有什么想法吗?
测试给定点是否所有坐标都在点之间就足够了。所以如果 (x1, y1, z1) 是最小角并且 (x2, y2, z2) 是最大点,测试点 (x, y, z),测试验证 x1 <= x <= x2,并且对于 y 和 z 也类似。
如果这看起来不明显,只需意识到与坐标轴对齐的立方体是位于平面 x = x1 左侧和平面 x = x2 右侧、平面 y = y1 上方的区域和下面的 y = y2,等等。立方体中的点是同时满足所有六个不等式的点。这正是您要验证的内容。
如果立方体没有与坐标轴对齐,则无法从两个角确定。相反,它是通过给出确定面大小的平面的不等式来描述的。您需要检查所有六个是否都满意。这总是可以写成矩阵不等式。在这种情况下,一个 6x3 矩阵,三列,因为点在 3d space 中,每个约束一行。这是一般情况,但对于所述问题来说有点矫枉过正。
例如,您可以计算 3 个投影(针对每个轴)。
例如,如果你想要 Z 轴的投影,你可以从你的点坐标中删除 Z 值:
projection({1,2,3}) -> {1,2}
然后判断正方形内的投影(点)也就是底部(或顶部)4个点的投影。
其他轴的答案相同。
当每个点的坐标都在 x、y 和 z 的相应范围内时,点 p = (x, y, z)
位于具有扩展 [x_0, x_1] x [y_0, y_1] x [z_0, z_1]
的立方体内部。那是伪代码
bool PointIsInCube( Point3D p, float x_max, float x_min, float y_max, float y_min, float z_max, float z_min)
{
return (p.x <= x_max && p.x >= x_min) && (p.y <= y_max && p.y >= y_min) && (p.z <= z_max && p.z >= z_min);
}
对于给定的立方体,如果我没看错的话,间隔将为 [1,5]x[2,6]x[1,4]。 (x 的第一个间隔,y 的第二个间隔,z 的第三个间隔)
我需要最好的解决方案,如果可能的话,不是脏代码,而是一些智能代码。
我不熟悉3D编程。
我必须编写一个函数,如果一个点在 3D space (x, y, z) 中,它将 return。将提供 space 中立方体的范围(例如范围 { {1,2,1}, {5,6,4} })
有什么想法吗?
测试给定点是否所有坐标都在点之间就足够了。所以如果 (x1, y1, z1) 是最小角并且 (x2, y2, z2) 是最大点,测试点 (x, y, z),测试验证 x1 <= x <= x2,并且对于 y 和 z 也类似。
如果这看起来不明显,只需意识到与坐标轴对齐的立方体是位于平面 x = x1 左侧和平面 x = x2 右侧、平面 y = y1 上方的区域和下面的 y = y2,等等。立方体中的点是同时满足所有六个不等式的点。这正是您要验证的内容。
如果立方体没有与坐标轴对齐,则无法从两个角确定。相反,它是通过给出确定面大小的平面的不等式来描述的。您需要检查所有六个是否都满意。这总是可以写成矩阵不等式。在这种情况下,一个 6x3 矩阵,三列,因为点在 3d space 中,每个约束一行。这是一般情况,但对于所述问题来说有点矫枉过正。
例如,您可以计算 3 个投影(针对每个轴)。 例如,如果你想要 Z 轴的投影,你可以从你的点坐标中删除 Z 值:
projection({1,2,3}) -> {1,2}
然后判断正方形内的投影(点)也就是底部(或顶部)4个点的投影。 其他轴的答案相同。
当每个点的坐标都在 x、y 和 z 的相应范围内时,点 p = (x, y, z)
位于具有扩展 [x_0, x_1] x [y_0, y_1] x [z_0, z_1]
的立方体内部。那是伪代码
bool PointIsInCube( Point3D p, float x_max, float x_min, float y_max, float y_min, float z_max, float z_min)
{
return (p.x <= x_max && p.x >= x_min) && (p.y <= y_max && p.y >= y_min) && (p.z <= z_max && p.z >= z_min);
}
对于给定的立方体,如果我没看错的话,间隔将为 [1,5]x[2,6]x[1,4]。 (x 的第一个间隔,y 的第二个间隔,z 的第三个间隔)