我想知道是否有办法确定圆锥体是否与一条(有限的)线段相交。该圆锥实际上是位于P(x,y)处,具有θ度视野和半径r的圆:
我正在尝试用C#完成这个任务,但是我不知道该怎么做,所以目前我的做法是:
- 检查线段是否与圆相交;
- 如果线段与圆相交,则使用一个我在这里找到的函数检查线段中的每个点。
但我认为这不是最好的方法。有人有什么想法吗?
另外,我需要这个函数来制作一种简单的视觉模拟器。
我想知道是否有办法确定圆锥体是否与一条(有限的)线段相交。该圆锥实际上是位于P(x,y)处,具有θ度视野和半径r的圆:
我正在尝试用C#完成这个任务,但是我不知道该怎么做,所以目前我的做法是:
但我认为这不是最好的方法。有人有什么想法吗?
另外,我需要这个函数来制作一种简单的视觉模拟器。
r1 <= r
r2 <= r
ang1 <= theta
ang2 <= theta
R = p sec(ang - 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的值。一旦您知道omega是多少,就可以解出p的值。
现在我们需要知道是否存在某个(R,ang)组合在这条线上,使得
R <= r
0 <= ang <= theta
min{ang1, ang2} <= ang <= max{ang1, ang2}
Rcos(ang-omega) = p
我会在谷歌上搜索线段/凸多边形相交算法,因为你的视野由一个三角形和一个可以通过凸多边形以任何精度逼近的圆形部分组成。你的第一步可能仍然有用,可以排除与视野毫无关系的线段。
如果您像上面那样保持2D,则可以按以下方式计算交点:
线段的起点为S1,终点为S2。代码的左边缘是沿着边缘C1的向量,右边缘是C2,代码的原点是O。
取由(O到S1)和C1形成的向量的叉积的Z分量的符号。
取由(O到S2)和C1形成的向量的叉积的Z分量的符号。如果符号不同,则您的起点和终点在C1的两侧,因此它们必须相交。如果没有,请使用C2而不是C1进行相同的比较。
如果两侧的符号都相同,则没有边缘相交。
在3D中,情况会更加复杂。我已经搜索了许多次圆锥体相交。对于线条,做法非常相似,我只需要再考虑一下:)
快速谷歌搜索“圆锥线相交”可以得到各种结果。基本思路是从圆锥的起点和终点形成一个平面。一旦你有了这个平面,就可以计算出该平面与圆锥方向法线之间的夹角。如果该角度小于圆锥张角,则表示它们相交。