Работа с Полярные координаты может помочь. Здесь, вместо того, чтобы представлять точку как (x, y), вы представляете ее как (r, угол), где r - расстояние от начала координат, а угол - угол, созданный с выбранной осью (что соответствует углу 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
Мы можем использовать полярную нормальную форму
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
(обратная функция загара), чтобы получить значение омега. Как только вы узнаете, что такое омега, вы можете решить за 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-omega) - это очень хорошо управляемая функция с точки зрения монотонности, и вам нужно рассматривать ее только в интервале [min {ang1, ang2}, max {ang1, ang2}].
Сначала вы должны будете выполнить некоторые ручные манипуляции, чтобы упростить код.
Я оставлю вам остальное.