Взяв задачу сверху, я проверил вашу формулу - см. Эскиз, чтобы подтвердить, что я вас правильно понял.
Учитывая, что мы знаем A и Z и хотим найти для X, я сначала написал:
загар (A) = X / Z
переставляя, я получаю:
X = Z tan (A)
Так как Z = 5 и A = 22,5 градуса ...
X = 5 * загар (22,5 градуса)
X = 2,07106781
Итак, кажется, что вы правильно поняли математические данные, но ваш код неверен - может быть, ваша функция загара ожидает градусы, а не радианы, или fovAngle не был установлен? Я думаю, вам нужно отладить и вручную проверить каждое значение.
Возвращаясь к более широкой проблеме выяснения того, что лежит и не лежит внутри вашего усеченного конуса, вы можете обнаружить, что вы можете использовать другой тест для более элегантного ответа на тот же вопрос. Многие графические кодеры используют тест "side-of-plane". Учтите, что ваш усеченный обзор - это объем пространства, ограниченный набором из 6 плоскостей (4 для сторон вашего окна просмотра, ближней плоскости отсечения и дальней плоскости отсечения).
Учитывая точку на плоскости и нормаль для плоскости, вы можете довольно легко вычислить уравнение плоскости, что, в свою очередь, делает тривиальным проверить, находится ли данная точка "внутри" (в направлении нормального) данной плоскости . Выполните итерацию по всем 6 плоскостям, и вы быстро управляете заданной точкой в объеме просмотра.
По-настоящему изящная вещь в этом тесте заключается в том, насколько легко вы можете использовать его повторно: любой простой выпуклый многоугольник, на котором вы хотите провести тесты (например, прямоугольник), можно описать как набор плоскостей, что -используй свой тест "изнутри или снаружи". Очень общее.