summaryrefslogtreecommitdiffhomepage
path: root/DumpSource.cpp
blob: 56b3336ec6ad3e72d32ffd9a18e65379ead8dab1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "DumpSource.h"

#include <cmath>
#include <string>
#include <utility>
#include <vector>

#include <nlohmann/json.hpp>
#include <raylib.h>

#include "Grid.h"
#include "Killmail.h"
#include "LongVector3.h"


using json = nlohmann::json;


static constexpr long double SCALE {.0001};
static constexpr long double EXTENT {1000 * 50000};


static Grid& find_grid_for(std::vector<Grid>& grids, const LongVector3& original);


DumpSource::DumpSource(const char* filename) :
    m_grids {}
{
    if (!FileExists(filename))
        throw "File does not exist";
    char* text = LoadFileText(filename);
    auto dump = json::parse(text);
    for (const auto& info : dump["killmails"]) {
        Killmail km;
        km.original = {
            info["victim"]["position"]["x"].get<long double>(),
            info["victim"]["position"]["y"].get<long double>(),
            info["victim"]["position"]["z"].get<long double>(),
        };
        auto id = info["solar_system_id"].get<long int>();
        auto location = dump["locations"][std::to_string(id)];
        km.location.system = location["name"].get<std::string>().data();
        km.location.constellation = location["constellation"].get<std::string>().data();
        km.location.region = location["region"].get<std::string>().data();
        auto& grid = find_grid_for(m_grids, km.original);
        grid.killmails.push_back(std::move(km));
    }
    UnloadFileText(text);
    for (auto& grid : m_grids) {
        LongVector3 average {0, 0, 0};
        for (const auto& km : grid.killmails) {
            average.x += km.original.x;
            average.y += km.original.y;
            average.z += km.original.z;
        }
        const auto killmails = grid.killmails.size();
        average.x /= killmails;
        average.y /= killmails;
        average.z /= killmails;
        for (auto& km : grid.killmails) {
            km.position = {
                static_cast<float>((km.original.x - average.x) * SCALE),
                static_cast<float>((km.original.y - average.y) * SCALE),
                static_cast<float>((km.original.z - average.z) * SCALE),
            };
        }
        grid.origin = average;
    }
}


std::vector<Grid>
DumpSource::grids() const
{
    return m_grids;
}


Grid&
find_grid_for(std::vector<Grid>& grids, const LongVector3& original)
{
    for (auto& grid : grids) {
        for (auto& km : grid.killmails) {
            const long double dist =
                std::sqrt(
                    std::pow(original.x - km.original.x, 2) +
                    std::pow(original.y - km.original.y, 2) +
                    std::pow(original.z - km.original.z, 2));
            if (dist < EXTENT)
                return grid;
        }
    }
    grids.push_back(Grid{});
    return grids.back();
}