如何在3D空间中检测点是否在锥体内?

时间:2012-10-10 18:37:54

标签: matlab c#-4.0 math

如何检测3D点是否在锥体内?

Ross cone = (x1, y1, h1)
Cone angle = alpha
Height of the cone = H
Cone radius = R
Coordinates of the point of the cone = P1 (x2, y2, h2)
Coordinates outside the cone = P2( x3, y3, h3)

Result for point1 = true
Result for point2 = false

4 个答案:

答案 0 :(得分:20)

扩展Ignacio的回答:

x = the tip of the cone
dir = the normalized axis vector, pointing from the tip to the base
h = height
r = base radius

p = point to test

所以你将p投射到dir上以找到沿轴的点距离:

cone_dist = dot(p - x, dir)

此时,您可以拒绝0 <= cone_dist <= h以外的值。

然后计算沿轴的那个点的锥半径:

cone_radius = (cone_dist / h) * r

最后计算点与轴的正交距离,以与锥半径进行比较:

orth_distance = length((p - x) - cone_dist * dir)

is_point_inside_cone = (orth_distance < cone_radius)

答案 1 :(得分:5)

圆锥只是无数个圆,其大小由线性方程定义,该方程取自该点的距离。只需检查它是否在适当大小的圆圈内。

答案 2 :(得分:5)

与语言无关的答案:

  • 找到定义圆锥主轴的直线方程。
  • 计算distance from the 3D point to the line,以及沿距离线垂直的线的交点。
  • 在交点处找到圆锥的半径,并检查直线与3D点之间的距离是否大于(外部)或小于(内部)该半径。

答案 3 :(得分:0)

更容易计算矢量与锥心之间的角度和从指向评估点的顶点的矢量。如果使用矢量投影并且合成矢量的长度较短,那么指向锥体中心的矢量在角度和长度之间就知道你是否在锥体内。

https://en.wikipedia.org/wiki/Vector_projection