Libgdx / Java: после преобразования GPS в пиксельные координаты маршрут поворачивается на 90 ° - PullRequest
0 голосов
/ 30 июня 2018

Я писал ранее о реализации карты в моем проекте libgdx.

Я сделал это, используя снимок упомянутой карты Google, импортировав границы снимка GPS, значения широты маршрута, сервис местоположения (через интерфейс) и снимок в виде строки Gdx.files.local.

Надеюсь, последняя проблема, с которой я столкнулся сейчас, заключается в том, что маршрут поворачивается на 45 градусов по часовой стрелке. Иначе мои «враги» пройдут идеальный путь. Я уже понял, что мне нужно «перевернуть» мою ось Y; до этого он вращался и переворачивался вверх ногами.

Я надеялся, что кто-то здесь с большим опытом, возможно, имел дело с чем-то подобным и имел несколько советов:)

Это в основном код, который создает массив точек маршрута после преобразования координат GPS в координаты пикселей, которые соответствуют gps-границам снимка карты (нижний левый угол и верхний правый угол смотрите здесь , а также ширину и высоту текстуры карты.

private void convertPathToScreen(double[] gpsRoute){
    for(int i = 0; i<gpsRoute.length; i++){
        if(i % 2 != 0) {
            screenRouteCoordinates[i] = 
x_GpsToScreenConversion(gpsRouteCoordinates[i]);
        }
        else{
            screenRouteCoordinates[i] = 
y_GpsToScreenConversion(gpsRouteCoordinates[i]);
        }

    }
}

public int x_GpsToScreenConversion(double x_pointInGpsCoords){
    double percentage = 1 - Math.abs((x_pointInGpsCoords - x_GpsMin) / 
(x_GpsMax - x_GpsMin));
    return  (int)((percentage* Math.abs(mapWidth - mapOrigin)) + mapOrigin);
}


public int y_GpsToScreenConversion(double y_pointInGpsCoords){
    double percentage = (y_pointInGpsCoords - y_GpsMin) / (y_GpsMax - y_GpsMin);
    return  (int)((percentage* Math.abs(mapHeight - mapOrigin)) + mapOrigin);
}

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

private void calculatePathing(){
    angle = (float) (Math.atan2(waypointsToGoal[waypoint].y - getY(), waypointsToGoal[waypoint].x - getX()));
    velocity.set((float) Math.cos(angle) * speed, (float) Math.sin(angle) * speed);
}

Итак, вопрос в основном: как мне исправить поворот на 90 ° по часовой стрелке, который мешает моей игре? Могу ли я повернуть координаты массива вокруг центра карты (куда идут все враги) или здесь есть ошибка в коде конверсии?

1 Ответ

0 голосов
/ 30 июня 2018

Решение: (Лоскутное одеяло, но оно выполняет свою работу!)

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

private void createWaypointArray(){

    //formula requires radians
    double angle = Math.toRadians(90);

    double current_x;
    double current_y;

    // waypointCache.size()-1 gets me the last waypoint, the destination around which I rotate
    double center_x = waypointCache.get(waypointCache.size()-1).x;
    double center_y= waypointCache.get(waypointCache.size()-1).y;

    // Loop through Vector2 Array, rotate the points around destination and save them
    for(int i = 0; i < waypointCache.size()-1; i++){
        current_x = waypointCache.get(i).x;
        current_y = waypointCache.get(i).y;

        waypointCache.get(i).x = (float)((current_x-center_x) * Math.cos(angle) - (current_y-center_y) * Math.sin(angle) + center_x);
        waypointCache.get(i).y = (float)((current_x-center_x) * Math.sin(angle) + (current_y-center_y) * Math.cos(angle) + center_y);

    //  this does work, but also translates the points because it rotates around the 
    //  worldaxis, usable when points lie on normal kartesian axis I guess
    //  waypointCache.get(i).rotate(90);
    }
    this.wayPointArray = waypointCache.toArray(new Vector2[waypointCache.size()]);

}
...