Расчет направления на основе смещения точек - PullRequest
6 голосов
/ 29 августа 2010

Для моей игры на основе плиток мне нужно рассчитать направление на основе заданного смещения точки (разница между двумя точками).Например, скажем, я стою в точке (10, 4) и хочу перейти в точку (8, 6).Направление, в котором я двигаюсь, это северо-запад.Как лучше всего это рассчитать?

Вот базовая реализация Java.

public int direction(int x, int y) {
    if (x > 0) {
        if (y > 0) {
            return 0; // NE
        } else if (y < 0) {
            return 1; // SE
        } else {
            return 2; // E
        }
    } else if (x < 0) {
        if (y > 0) {
            return 3; // NW
        } else if (y < 0) {
            return 4; // SW
        } else {
            return 5; // W
        }
    } else {
        if (y > 0) {
            return 6; // N
        } else if (y < 0) {
            return 7; // S
        } else {
            return -1;
        }
    }
}

Конечно, ее можно оптимизировать или сократить.Любая помощь?Спасибо.

Ответы [ 5 ]

4 голосов
/ 29 августа 2010

Я думаю, что самым простым для понимания способом было бы создание статического массива, который содержит значения для всех случаев.

// Won't say anything about how much these values make sense
static final int[][] directions = {
    {3,  6, 0},
    {5, -1, 2}, // -1 for "no direction", feel free to replace
    {4,  7, 1}
};

public int direction(int x, int y) {
    x = (x < 0) ? 0 : ((x > 0) ? 2 : 1);
    y = (y < 0) ? 0 : ((y > 0) ? 2 : 1);

    return directions[y][x];
}

Редактировать: Теперь это правильно (почему во многих языках отсутствует правильная функция sgn?)

1 голос
/ 29 августа 2010

Мои ответы с условиями if:).

   public int direction(int x, int y) {
        //0 NE, 1 SE, 2 E, 3 NW, 4 SW, 5 W, 6 N, 7 S, 8 (Same place / Not a direction)  
        int direction = 0;

        if(x < 0){
            direction = 3;
        }else if(x == 0){
            direction = 6;
        }

        if(y < 0){
            direction = direction + 1;
        }else if(y == 0){
            direction = direction + 2;
        }
            return direction;
    }
0 голосов
/ 29 августа 2010

Вы можете получать и возвращать свое направление в виде Точки или чего-то подобного (в любом случае, (x, y) кортеж).Поэтому, если вы стоите в p0 = (10, 4) и хотите перейти к p1 = (8, 6), результат будет (в псевдокоде):

norm(p1 - p0) = norm((-2,2)) = (-1,1)

Вы можете вычислить нормуцелого числа, если вы делите его на его абсолютное значение.Таким образом, для точки вы рассчитываете норму обоих членов.Просто помните, что (-1,1) более выразительно, чем 3, и вы можете работать с ним проще.

Если вам нужны конкретные операции, вы можете создать свой собственный класс Java Point или расширитьсуществующие в библиотеке.

0 голосов
/ 29 августа 2010

Это примерно так же кратко и чисто, как вы можете получить, если представить таким образом восемь основных направлений в виде отдельных перечисляемых значений.Вы выбираете между восемью различными возвращаемыми значениями, поэтому лучше всего сделать дерево решений с восемью листьями.

Вы можете получить что-то немного более аккуратное, если разделите направление на два компонента (NS и EW)но, не зная больше о том, что вы делаете с указанием, мы не можем знать, стоит ли это хлопот.

0 голосов
/ 29 августа 2010
  • определяет двумерный массив для хранения всех состояний.

  • преобразовать x и y в 0, 1 или 2 на основе их значения (x> 0 или x

  • возвращает определенный индекс массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...