C# 圆锥线段交点2D

C# 圆锥线段交点2D,c#,geometry,collision-detection,C#,Geometry,Collision Detection,我想知道是否有任何方法可以确定圆锥体是否与(有限)线段相交。圆锥体实际上是一个位于P(x,y)的圆,视野为θ度,半径为r: 我试着用C#来做,但我不知道怎么做,所以现在我要做的是: 检查线段是否与圆相交 如果线段与圆相交,则使用我找到的函数检查线段中的每个点 但我不认为这是最好的方法。有人有主意吗 要了解更多信息,我需要此函数来制作某种简单的视觉模拟器。我会搜索直线/凸多边形相交算法,您的视野由三角形和圆的一部分组成,可以通过凸多边形近似到任何精度。您的第一步可能仍然有助于排除不在视野附近的

我想知道是否有任何方法可以确定圆锥体是否与(有限)线段相交。圆锥体实际上是一个位于P(x,y)的圆,视野为θ度,半径为r:

我试着用C#来做,但我不知道怎么做,所以现在我要做的是:

  • 检查线段是否与圆相交
  • 如果线段与圆相交,则使用我找到的函数检查线段中的每个点
  • 但我不认为这是最好的方法。有人有主意吗


    要了解更多信息,我需要此函数来制作某种简单的视觉模拟器。

    我会搜索直线/凸多边形相交算法,您的视野由三角形和圆的一部分组成,可以通过凸多边形近似到任何精度。您的第一步可能仍然有助于排除不在视野附近的线。

    如果您像上面一样将其保持为2D,则可以按如下方式计算交点:

    线段起点为S1,终点为S2。 代码的左边缘是沿边缘C1的向量,右边缘是C2,代码的原点是O

    取由(O到S1)和C1构成的向量的叉积的Z分量的符号

    取从(O到S2)和C1的向量的叉积的Z分量的符号。如果符号不同,则起点和终点位于C1的两侧,因此它们必须相交。如果不是,则与C2而不是C1进行相同的比较

    如果两边的标志都不相同,则没有边相交

    在3D中,它有点复杂。我在谷歌上搜索过无数次,发现了圆锥体和球体的交点。为台词做这件事,会非常相似,我只需要想一想:)

    一个快速的“圆锥线交点”谷歌搜索得到了各种各样的点击。基本思想是从圆锥体的原点和直线的起点和终点形成一个平面。一旦你有了它,你就可以得到这个平面和圆锥体法线方向之间的角度。如果该角度小于圆锥体上的展开角度,则有一个交点。

    处理可能会有所帮助。在这里,不是将点表示为(x,y),而是将其表示为(r,角度),其中r是与原点的距离,角度是与所选轴形成的角度(对应于角度0)

    在您的例子中,如果您将p(x,y)设置为原点,将圆锥体的一条光线设置为角度=0,并找到线段端点的极坐标,例如(r1,ang1)和(r2,ang2),则需要满足以下四个条件才能使线段完全位于圆锥体的范围内(包括边界)

    r1 <= r
    r2 <= r
    
    ang1 <= theta
    ang2 <= theta
    
    给定线段的两个端点,我们可以算出p和ω,如下所示:

    我们有

    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}
    

    现在COS(ang-Omega)是单调性非常好的函数,在区间[min {ang1,ang2},max {ang1,ang2}]中只需要考虑它。 为了简化代码,您应该能够首先进行一些手动操作


    剩下的就留给你了。

    谢谢!我试试看。。事实上,我试着用谷歌搜索我的问题,但由于我的数学不是很好,我有点麻烦……)谢谢!我想这就是我需要的。我会试试看,然后很快回来:)@moron.很抱歉,我整个星期都很忙,所以我还没有试着去实现它..但我计划这周去做..我会很快让你知道..thx!:)哦,但我有一个问题,所以当只有一半的线段与圆锥体相交时,这个代码不起作用。我说得对吗?@nophnoph。我误解了这个问题。你说得对,它只适用于完全相交(即完全在圆锥体内的线段)。@nophnoph:我对答案进行了编辑,以提供更多可能对你有用的信息。祝你好运@白痴:谢谢你的回答。我知道了,但是因为数学对我来说很难,我对“给定线段的两个端点,我们可以算出p和ω”感到困惑。我应该用哪个方程来求p和ω?很抱歉问这个简单的问题,但是我已经从你给我的链接中读到了,但是我还是不明白。谢谢你的帮助:)@dtb:thanx帮我插入图片:)
    R <= r
    0 <= ang <= theta
    min{ang1, ang2} <= ang <= max{ang1, ang2}
    
    Rcos(ang-omega) = p