使用Polar Co-ordinates 可能会有所帮助。在这里,不是将一个点表示为 (x,y),而是将其表示为 (r, angle),其中 r 是与原点的距离,而 angle 是与所选轴形成的角度(对应于角度 0)。
在您的情况下,如果您将 P(x,y) 设置为原点,并且将锥体的光线之一设置为角度 = 0,并找到线段端点的极坐标,例如 (r1, ang1) 和 (r2, ang2) 那么您需要满足以下四个条件才能使线段完全位于圆锥体的范围内(包括边界)。
r1 <= r
r2 <= r
ang1 <= theta
ang2 <= theta
其中 r 是圆锥的半径,theta 是视角,您选择了轴,以便逆时针旋转会产生相应的正角。
在极坐标和 (x,y)(称为矩形)坐标之间切换很容易,您可以在我上面给出的 wiki 链接上找到它。
为了确定线段的任何点是否与曲线相交,您可以使用此处给出的直线极坐标方程:http://mathforum.org/dr.math/faq/formulas/faq.polar.html
我们可以使用极坐标范式
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 的值。一旦你知道什么是 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}] 中考虑它。
您应该能够先进行一些手动操作以简化您的代码。
剩下的交给你。