我想知道是否有任何方法可以确定圆锥体是否与(有限)线段相交。圆锥体实际上是一个位于 P(x,y) 处,视场角为 θ,半径为 r 的圆:
我正在尝试用 C# 来做,但我不知道该怎么做,所以现在我正在做的是:
- 检查线段是否与圆相交;
- 如果线段与圆相交,那么我使用找到的函数检查线段中的每个点 here .
但我认为这不是最好的方法。有人有想法吗?
有关其他信息,我需要此功能来制作某种简单的视觉模拟器。
最佳答案
使用 Polar Co-ordinates可能有帮助。在这里,不是将点表示为 (x,y),而是将其表示为 (r, angle),其中 r 是距原点的距离,angle 是与所选轴形成的角度(对应于角度 0)。
在您的情况下,如果您将 P(x,y) 设置为原点,并将圆锥体的一条射线设置为 angle = 0 并找到线段端点的极坐标,例如 (r1, ang1) 和 (r2, ang2) 那么你需要满足以下四个条件才能使线段完全在圆锥内(包括边界)。
r1 <= r
r2 <= r
ang1 <= theta
ang2 <= theta
其中 r 是圆锥体的半径,theta 是视角,您选择轴以便逆时针旋转给出相应的正角度。
在极坐标和 (x,y)(称为矩形)坐标之间切换很容易,您可以在我上面提供的 wiki 链接上找到它。
为了确定线段的任何点是否与曲线相交,您可以使用此处给出的线的极坐标方程:Link
我们可以使用极坐标范式
R = p sec(ang - omega)
给定线段的两个端点,我们可以计算出 p 和 omega,如下所示:
我们有
p = r1 * cos(ang1-omega) = r2*cos(ang2-omega)
使用 cos(x-y) = cos(x)*cos(y) + sin(x)*sin(y)
我们得到
[r1*cos(ang1) - r2*cos(ang2)] * cos(omega) = [r2*sin(ang2) - r1*sin(ang1)] * sin(omega)
因此您可以计算 tan(omega) = sin(omega)/cos(omega)
并使用 arctan
(tan 的反函数)来获得值欧米茄。一旦知道什么是 omega,就可以求解 p。
现在我们需要知道这条线上是否有一些 (R, ang) 组合使得
R <= r
0 <= ang <= theta
min{ang1, ang2} <= ang <= max{ang1, ang2}
(注r为圆锥半径,theta为视角,ang1为P1角度,ang2为P2角度)
方程可以改写为
Rcos(ang-omega) = p
现在 cos(ang-omega) 在单调性方面是一个表现非常好的函数,您只需要在 [min{ang1, ang2}, max{ang1, ang2}] 区间内考虑它。
您应该能够先进行一些手动操作,以简化您的代码。
剩下的就交给你了。
关于c# - 锥线段相交 2D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2850974/