Как вычислить направление в котором игрок поставил блок

Alexandr10

Каменная лига
Сообщения
13
Лучшие ответы
0
Симпатии
0
#1
Версия Minecraft
1.7.10
Подтверждение
Я максимально подробно описал проблему, включая исходный код файлов, краш лог, изображения и другую информацию, которая может помочь пользователям форума решить мой вопрос!
Нужно вычислить направление(СЕВЕР, ЮГ, ЗАПАД, ВОСТОК в плоскости XZ) в котором был поставлен блок относительно игрока
имея координаты игрока и блока.
 

Вложения

Agravaine

Алмазная лига
Сообщения
4,056
Лучшие ответы
150
Симпатии
430
#2
int direction = MathHelper.floor_double((player.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
 

MaxVaryingFloats = 32;

Золотая лига
Сообщения
1,750
Лучшие ответы
47
Симпатии
280
#3
Можно измерить абсолютный угол между игроком и блоком, и через него уже сторону света. Если вкратце, то считаешь угол через Math#atan2, туда нужно тоже передавать дельты координат(x= blockX - playerX, y = blockZ - playerZ). И переводишь радианы в градусы. далее считаешь уже, если угол в пределах 0-90 градусов, то одна сторона, если в пределах 90-180 то другая, и т.д.
 

MaxVaryingFloats = 32;

Золотая лига
Сообщения
1,750
Лучшие ответы
47
Симпатии
280
#4
Да ну, рассчитай мне направление взгляда, имя только координаты игрока
 

Alexandr10

Каменная лига
Сообщения
13
Лучшие ответы
0
Симпатии
0
#5
Можно измерить абсолютный угол между игроком и блоком, и через него уже сторону света. Если вкратце, то считаешь угол через Math#atan2, туда нужно тоже передавать дельты координат(x= blockX - playerX, y = blockZ - playerZ). И переводишь радианы в градусы. далее считаешь уже, если угол в пределах 0-90 градусов, то одна сторона, если в пределах 90-180 то другая, и т.д.
Я так понимаю этот код делает то, что мне нужно
Java:
    public enum Side {EAST, SOUTH, WEST, NORTH};
    public static Side get2dOrientation(double x1, double z1, double x2, double z2) {
        double dx = x1 - x2;
        double dz = z1 - z2;
        double angle = Math.atan2(dz, dx) / Math.PI * 180 + 180;

        if (angle < 45 || angle > 315) {
            return Side.EAST;
        } else if (angle < 135) {
            return Side.SOUTH;
        } else if (angle < 225) {
            return Side.WEST;
        } else {
            return Side.NORTH;
        }
    }
 

MaxVaryingFloats = 32;

Золотая лига
Сообщения
1,750
Лучшие ответы
47
Симпатии
280
#6
Да, ты правда как-то странно сторону определяешь.
 

mbutakov_

Каменная лига
Сообщения
204
Лучшие ответы
6
Симпатии
9
#8
Если ты так делаешь то градусы наверное было лучше указsывать типа что допустим
if angel > 0 && angel <90)
и потом следующию
if angel >90 && angel <180
if angel >180 && angel <270
if angel >270 && angel <360



Я так понимаю этот код делает то, что мне нужно
Java:
    public enum Side {EAST, SOUTH, WEST, NORTH};
    public static Side get2dOrientation(double x1, double z1, double x2, double z2) {
        double dx = x1 - x2;
        double dz = z1 - z2;
        double angle = Math.atan2(dz, dx) / Math.PI * 180 + 180;

        if (angle < 45 || angle > 315) {
            return Side.EAST;
        } else if (angle < 135) {
            return Side.SOUTH;
        } else if (angle < 225) {
            return Side.WEST;
        } else {
            return Side.NORTH;
        }
    }
 
Сверху