使用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}]。
为了简化您的代码,您应该可以先进行一些手动操作。
我会把剩下的给你。
@dtb:thanx帮我插入图片:) – nophnoph 2010-05-18 02:43:22