Почему я проваливаюсь по модулю вычитания? - PullRequest
1 голос
/ 26 января 2012

О боже, это должно быть так просто.У меня есть курс в диапазоне (0, 2π) и две точки, из которых я получаю промежуточный курс.Я должен сравнить их, чтобы увидеть, находится ли один в диапазоне другого.То, что у меня так далеко, это:

//get the angle
float angle = atan(here.x - there.x, here.y - there.y);

//atan2 uses (-pi, pi) range, convert to (0, 2pi)
if(angle < 0) angle += 2*pi;

//subtract them pesky headings
float diff = angle - givenAngle;

//a difference of 350 degrees really is a difference of 10 degrees
if(diff > pi) diff = 2*pi - diff;

//a difference of -10 degrees really is a difference of 10 degrees
if(diff < 0) diff *= -1;

//check if the point is in range of givenAngle
if(diff > fov) do_magic(diff - fov);

Однако у меня возникают всевозможные проблемы, когда оба угла приближаются к нулю, и я трачу слишком много сил на решение этой решенной проблемы.1004 *

Где я делаю это неправильно?Как правильно найти разницу между двумя заголовками?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Я подозреваю, что порядок ваших операций может быть немного неправильным:

//a difference of 350 degrees really is a difference of 10 degrees
if(diff > pi) diff = 2*pi - diff;

//a difference of -10 degrees really is a difference of 10 degrees
if(diff < 0) diff *= -1;

Это не учитывает разницу в -350, но если вы переключите операторы, это сделает:

//a difference of -10 degrees really is a difference of 10 degrees
if(diff < 0) diff *= -1;

//a difference of ±350 degrees really is a difference of 10 degrees
if(diff > pi) diff = 2*pi - diff;
0 голосов
/ 26 января 2012

Одна из главных проблем была в этой строке:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...