如何在三维空间中检测一个点是否在锥形内部?

9
如何检测一个三维点是否在圆锥内?
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

3
什么坐标系?如何表示圆锥? - Beta
1
这个问题的一般化(涉及椭圆锥)在http://math.stackexchange.com/questions/5799/how-do-i-determine-if-a-point-is-interior-to-an-elliptical-cone得到了回答。 - andand
4个回答

34

进一步解释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)

我不知道是否可能更清晰地描述,并用数学公式给我,我只是英语不好。如果您有照片那就太好了。 - Saber Fathollahi
我的回答中的code部分就像数学公式和伪代码一样。我很乐意更详细地解释任何部分。你需要哪个部分的帮助? - japreiss
1
如果您不熟悉此处如何使用点积,请参考以下链接:link - Heinzlmaen
1
为什么我只能点赞一次?! :) 这是一个非常清晰简洁的答案,比我查看的所有其他资源都解释得更好。 - Brad Allred
有人能解释一下在这种情况下伪函数 length() 内部发生了什么吗? - RobbieS

9

锥形只是无限多个圆的集合,其大小由线性方程定义,该方程以距离为变量。只需检查它是否在适当大小的圆内即可。


8

与编程语言无关的答案:

  • 找到定义锥体主轴的直线方程。
  • 计算三维点到该直线的距离,以及垂直于该直线的距离和直线上的交点。
  • 在交点处找到锥体半径,并检查直线和三维点之间的距离是否大于(外部)或小于(内部)该半径。

2

如果计算从锥形顶点指向评估点的向量和指向锥形中心的向量之间的角度会更容易。使用向量投影,如果结果向量的长度比指向锥形中心的向量短,则通过角度和长度之间的关系可以确定是否在圆锥内部。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接