diff options
author | Aki <please@ignore.pl> | 2022-05-07 23:51:13 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-05-07 23:51:13 +0200 |
commit | 8ad11975221b1448865400cab14a1560b71c6ade (patch) | |
tree | c2f54c25097b6534dd5ec386d37d6f3f0222ec92 /DumpSource.cpp | |
parent | 313b7a531106c623a28883db515f245a74a5fafb (diff) | |
download | derelict-8ad11975221b1448865400cab14a1560b71c6ade.zip derelict-8ad11975221b1448865400cab14a1560b71c6ade.tar.gz derelict-8ad11975221b1448865400cab14a1560b71c6ade.tar.bz2 |
Added support for sample dump loading
Diffstat (limited to 'DumpSource.cpp')
-rw-r--r-- | DumpSource.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/DumpSource.cpp b/DumpSource.cpp new file mode 100644 index 0000000..9c913d0 --- /dev/null +++ b/DumpSource.cpp @@ -0,0 +1,89 @@ +#include "DumpSource.h" + +#include <cmath> +#include <vector> +#include <utility> + +#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& 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(); +} |