#include "Reader.h" #include #include #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& grids, const LongVector3& position); std::vector Reader::read(Source& source) { std::vector 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((wreck.killmail.position.x - average.x) * SCALE), static_cast((wreck.killmail.position.y - average.y) * SCALE), static_cast((wreck.killmail.position.z - average.z) * SCALE), }; } grid.origin = average; } return grids; } Grid& find_grid_for(std::vector& 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(); }