2010-05-17 93 views
3

我想知道是否有任何方法来确定圆锥是否与(有限)线段相交。锥实际上是位于P(X,Y)与视图和半径为r的THETA度视场的圆圈:圆锥线段交点2D

Illustration http://img180.imageshack.us/img180/3461/conevision.png

我试图做到这一点在C#中,但我没有任何想法如何,现在这是我在做什么:

  1. 检查线段是否与圆相交;
  2. 如果线段与圆相交,则使用我找到的函数here检查线段中的每个点。

但我不认为这是做到这一点的最佳方式。有人有想法吗?

有关其他信息,我需要此功能来制作某种简单的视觉模拟器。

+0

@dtb:thanx帮我插入图片:) – nophnoph 2010-05-18 02:43:22

回答

2

使用Polar Co-ordinates可能会有所帮助。这里,不是将点表示为(x,y),而是将其表示为(r,角度),其中r是距离原点的距离,angle是与选定轴(对应于角度0)的角度。在你的情况下,如果你设置P(x,y)为原点,锥体的其中一条光线为角度= 0,并找到线段端点的极坐标,比如说(r1 ,ang1)和(r2,ang2),则需要满足以下四个条件,以使线段完全位于锥体的内部(包括边界)内。

r1 <= r 
r2 <= r 

ang1 <= theta 
ang2 <= theta 

其中r是锥体和θ的半径是视场角,并且选择的轴线,使得逆时针旋转给出了一个相应的正角。

在极坐标和(x,y)(称为矩形)坐标之间切换很容易,您可以在上面给出的维基链接上找到它。

为了确定是否任何点的线段相交的曲线,你可以用一条线的极坐标方程给这里:http://mathforum.org/dr.math/faq/formulas/faq.polar.html

我们可以使用Polar正常形态

R = p sec(ang - omega) 

我们可以计算出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(棕褐色的反函数)来获得欧米伽的值。一旦你知道欧米茄是什么,你可以解决p。

现在我们需要知道,如果有一些(R,ANG)在这条线,使得

R <= r 
0 <= ang <= theta 
min{ang1, ang2} <= ang <= max{ang1, ang2} 

(注r为圆锥体半径和θ为视角组合,ANG1是角的P1和ang2是P2的角度)。

的方程可以和改写为

Rcos(ang-omega) = p 

现在COS(ANG-ω)是在单调性的方面是非常讨人喜欢功能你只需要考虑它在区间[分钟{ANG1,ANG2 },max {ang1,ang2}]。

为了简化您的代码,您应该可以先进行一些手动操作。

我会把剩下的给你。

+0

谢谢!我认为这是我需要的 我会试试这个,并很快回来:) – nophnoph 2010-05-18 02:38:15

+0

@nophnoph:这是否适合你? – 2010-05-24 17:45:49

+0

@ moron.so对不起,我整个星期都非常忙,所以我还没有试图实现它..但我打算这周做..我会让你知道很快..谢谢! :) 哦,但我有一个问题,所以这段代码不工作时,只有一半的线段是与锥相交。我得到这个权利? – nophnoph 2010-05-25 15:50:26

0

我想谷歌周围的线/凸多边形相交算法,你的视野是由一个三角形和圆的一部分组成,可以用凸多边形近似任意精度。你的第一步可能仍然是有用的,以排除远离视野的线条。

0

如果保持它2D像以上,交叉点可被计算如下:线段的

起始点S1,结局是S2。 代码的左边缘是沿着边缘C1的向量,右边缘是C2,代码的原点是O.

取从由(O到S1)形成的向量的叉积的符号和C1。

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

如果两边的标志不一致,则不存在边缘相交。

在3D中,它有点复杂。我已经Google搜索并发现任何次数的锥形球面交点。做它的线条,将是非常类似的,我只需要考虑一下:)

“锥线交集”的快速谷歌有各种各样的点击。基本思想是从锥的起点和线的起点和终点形成一个平面。一旦你有了这个,你可以在该平面和锥体的方向之间的角度正常。如果该角度小于锥体上的展开角度,则表示有交点。

+0

谢谢!我会试一试.. 其实我已经尝试谷歌我的问题,但由于我的数学不是很好,我有一点麻烦.. :) – nophnoph 2010-05-18 02:34:13