Одна из главных проблем была в этой строке:
float angle = atan(here.x - there.x, here.y - there.y);
Было немного сложно заметить, но это не правильный порядок аргументов для atan
- даже математическое определение в Википедии принимает компонент y
(синус) до компонента x
(косинус).
float angle = atan(here.y - there.y, here.x - there.x);
Вторая проблема заключается в том, что, как выясняется, angle
был выключен на 180 градусов. Другими словами, вместо вычисления here - there
я должен вычислить there - here
.
float angle = atan(there.y - here.y, there.x - here.x);
Добавьте в наблюдение Сверре о неправильном порядке операций, и у нас есть кое-что, что работает намного лучше:
float angle = atan(there.y - here.y, there.x - here.x);
if(angle < 0) angle += pi * 2; //use (0, 2pi) range, the same as angle
float diff = abs(angle - givenAngle);
if(diff > pi) diff = 2*pi - diff;
if(diff > fov) do_magic(diff - fov);