c# - 锥线段相交 2D

标签 c# geometry collision-detection

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

Illustration

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

  1. 检查线段是否与圆相交;
  2. 如果线段与圆相交,那么我使用找到的函数检查线段中的每个点 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/

相关文章:

algorithm - 当分离轴定理 (SAT) 的叉积为零时该怎么办

c# - Unity 2D 碰撞检测不起作用

c# - 压缩二进制数据

svg - 如何在椭圆之间绘制箭头

python - 将一个矩形分割成n个大小相等的矩形

java - 这个奇怪的区域减法问题的原因是什么?

collision-detection - 对象碰撞编程(多次碰撞案例)

c# - 跨多个应用程序域进行日志记录

c# - 如何使用 C# 在 IIS 中获取网站的 "Browse"URL?

c# - CLR 引用到底是什么,它如何保存类型信息?