diff options
author | Aki <please@ignore.pl> | 2022-05-15 15:37:59 +0200 |
---|---|---|
committer | Aki <please@ignore.pl> | 2022-05-15 15:37:59 +0200 |
commit | 345bb237a7f682670a6107ae75afd948cc1f6ab6 (patch) | |
tree | fd4d2982d33c837bd7c4079e41434bbbf3ec8f8a /Reader.cpp | |
parent | 1b61e9b2b8c3b2218ec5a908a547180a642719e6 (diff) | |
download | derelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.zip derelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.tar.gz derelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.tar.bz2 |
Separated Wreck from Killmail
Diffstat (limited to 'Reader.cpp')
-rw-r--r-- | Reader.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Reader.cpp b/Reader.cpp new file mode 100644 index 0000000..f5c8de3 --- /dev/null +++ b/Reader.cpp @@ -0,0 +1,67 @@ +#include "Reader.h" + +#include <cmath> +#include <vector> + +#include "Grid.h" +#include "LongVector3.h" +#include "Source.h" +#include "Wreck.h" + + +static constexpr long double SCALE {.0001}; +static constexpr long double EXTENT {1000 * 50000}; + + +static Grid& find_grid_for(std::vector<Grid>& grids, const LongVector3& position); + + +std::vector<Grid> +Reader::read(Source& source) +{ + std::vector<Grid> grids; + for (auto& km : source.killmails()) { + auto& grid = find_grid_for(grids, km.position); + grid.wrecks.push_back(Wreck{Vector3{0, 0, 0}, km}); + } + for (auto& grid : grids) { + LongVector3 average {0, 0, 0}; + for (const auto& wreck : grid.wrecks) { + average.x += wreck.killmail.position.x; + average.y += wreck.killmail.position.y; + average.z += wreck.killmail.position.z; + } + const auto killmails = grid.wrecks.size(); + average.x /= killmails; + average.y /= killmails; + average.z /= killmails; + for (auto& wreck : grid.wrecks) { + wreck.position = { + static_cast<float>((wreck.killmail.position.x - average.x) * SCALE), + static_cast<float>((wreck.killmail.position.y - average.y) * SCALE), + static_cast<float>((wreck.killmail.position.z - average.z) * SCALE), + }; + } + grid.origin = average; + } + return grids; +} + + +Grid& +find_grid_for(std::vector<Grid>& grids, const LongVector3& position) +{ + for (auto& grid : grids) { + for (auto& wreck : grid.wrecks) { + const long double dist = + std::sqrt( + std::pow(position.x - wreck.killmail.position.x, 2) + + std::pow(position.y - wreck.killmail.position.y, 2) + + std::pow(position.z - wreck.killmail.position.z, 2)); + if (dist < EXTENT) + return grid; + } + } + grids.push_back(Grid{}); + return grids.back(); +} |