#include "Reader.h" #include #include #include #include #include "Grid.h" #include "LongVector3.h" #include "Source.h" #include "Timeline.h" #include "VectorMath.h" #include "Wreck.h" static constexpr long double SCALE {.0001}; static constexpr long double EXTENT {20000}; static Grid& find_grid_for(std::vector& grids, const LongVector3& position); std::tuple, Timeline> Reader::read(Source& source) { std::vector grids; std::time_t start {std::numeric_limits::max()}; std::time_t end {0}; for (auto& km : source.killmails()) { if (km.time < start) start = km.time; if (end < km.time) end = km.time; auto& grid = find_grid_for(grids, km.position); grid.wrecks.push_back(Wreck{Vector3{0, 0, 0}, km, 0, source.team(km.owner)}); } 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), }; wreck.time = static_cast(wreck.killmail.time - start); } grid.origin = average; } Timeline timeline(start, end); return {grids, timeline}; } Grid& find_grid_for(std::vector& grids, const LongVector3& position) { for (auto& grid : grids) for (auto& wreck : grid.wrecks) if (dist(position, wreck.killmail.position) < EXTENT) return grid; grids.push_back(Grid{}); return grids.back(); }