From 345bb237a7f682670a6107ae75afd948cc1f6ab6 Mon Sep 17 00:00:00 2001 From: Aki Date: Sun, 15 May 2022 15:37:59 +0200 Subject: Separated Wreck from Killmail --- CMakeLists.txt | 1 + DumpSource.cpp | 62 ++++++----------------------------------------------- DumpSource.h | 6 +++--- Grid.h | 6 ++---- Killmail.h | 5 +---- Reader.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Reader.h | 12 +++++++++++ Source.h | 4 ++-- View.cpp | 27 +++++++++++------------ View.h | 7 +++--- Wreck.h | 12 +++++++++++ main.cpp | 5 ++++- 12 files changed, 125 insertions(+), 89 deletions(-) create mode 100644 Reader.cpp create mode 100644 Reader.h create mode 100644 Wreck.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 94427fa..30ff0fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable( ${PROJECT_NAME} DumpSource.cpp main.cpp + Reader.cpp View.cpp ) target_link_libraries( diff --git a/DumpSource.cpp b/DumpSource.cpp index 56b3336..1fdf7a8 100644 --- a/DumpSource.cpp +++ b/DumpSource.cpp @@ -1,6 +1,5 @@ #include "DumpSource.h" -#include #include #include #include @@ -8,23 +7,14 @@ #include #include -#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& grids, const LongVector3& original); - - DumpSource::DumpSource(const char* filename) : - m_grids {} + m_killmails {} { if (!FileExists(filename)) throw "File does not exist"; @@ -32,7 +22,7 @@ DumpSource::DumpSource(const char* filename) : auto dump = json::parse(text); for (const auto& info : dump["killmails"]) { Killmail km; - km.original = { + km.position = { info["victim"]["position"]["x"].get(), info["victim"]["position"]["y"].get(), info["victim"]["position"]["z"].get(), @@ -42,54 +32,14 @@ DumpSource::DumpSource(const char* filename) : km.location.system = location["name"].get().data(); km.location.constellation = location["constellation"].get().data(); km.location.region = location["region"].get().data(); - auto& grid = find_grid_for(m_grids, km.original); - grid.killmails.push_back(std::move(km)); + m_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((km.original.x - average.x) * SCALE), - static_cast((km.original.y - average.y) * SCALE), - static_cast((km.original.z - average.z) * SCALE), - }; - } - grid.origin = average; - } } -std::vector -DumpSource::grids() const +std::vector +DumpSource::killmails() const { - return m_grids; -} - - -Grid& -find_grid_for(std::vector& 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(); + return m_killmails; } diff --git a/DumpSource.h b/DumpSource.h index e90c8af..3c18b69 100644 --- a/DumpSource.h +++ b/DumpSource.h @@ -2,7 +2,7 @@ #include -#include "Grid.h" +#include "Killmail.h" #include "Source.h" @@ -10,7 +10,7 @@ class DumpSource : public Source { public: explicit DumpSource(const char* filename); - std::vector grids() const override; + std::vector killmails() const override; private: - std::vector m_grids; + std::vector m_killmails; }; diff --git a/Grid.h b/Grid.h index 8a6c3e7..e9f45d7 100644 --- a/Grid.h +++ b/Grid.h @@ -2,14 +2,12 @@ #include -#include - -#include "Killmail.h" #include "LongVector3.h" +#include "Wreck.h" struct Grid { LongVector3 origin; - std::vector killmails; + std::vector wrecks; }; diff --git a/Killmail.h b/Killmail.h index cc0f06b..6550dc9 100644 --- a/Killmail.h +++ b/Killmail.h @@ -1,7 +1,5 @@ #pragma once -#include - #include "Location.h" #include "LongVector3.h" #include "Owner.h" @@ -13,6 +11,5 @@ struct Killmail Location location; Owner owner; Ship ship; - Vector3 position; - LongVector3 original; + LongVector3 position; }; 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 +#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(); +} diff --git a/Reader.h b/Reader.h new file mode 100644 index 0000000..6149958 --- /dev/null +++ b/Reader.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +#include "Grid.h" +#include "Source.h" + + +struct Reader +{ + static std::vector read(Source& source); +}; diff --git a/Source.h b/Source.h index c1d0876..1dba9ea 100644 --- a/Source.h +++ b/Source.h @@ -2,11 +2,11 @@ #include -#include "Grid.h" +#include "Killmail.h" struct Source { virtual ~Source() = default; - virtual std::vector grids() const = 0; + virtual std::vector killmails() const = 0; }; diff --git a/View.cpp b/View.cpp index c4b0e5a..77ab271 100644 --- a/View.cpp +++ b/View.cpp @@ -2,18 +2,16 @@ #include #include -#include -#include #include +#include "Grid.h" #include "Label.h" -#include "Source.h" -View::View(std::unique_ptr source) : +View::View(std::vector grids) : m_camera {}, - m_source {std::move(source)}, + m_grids {grids}, m_labels {}, m_grid {0} { @@ -29,28 +27,27 @@ View::View(std::unique_ptr source) : void View::update(const float dt) { - const auto grids = m_source->grids(); if (IsKeyPressed(KEY_SPACE)) { m_grid++; - if (m_grid >= grids.size()) + if (m_grid >= m_grids.size()) m_grid = 0; } UpdateCamera(&m_camera); const int height = GetScreenHeight(); const int width = GetScreenWidth(); - const auto killmails = grids.at(m_grid).killmails; + const auto wrecks = m_grids.at(m_grid).wrecks; m_labels.clear(); - m_labels.reserve(killmails.size()); - for (const auto& km : killmails) { - const auto pos = GetWorldToScreen(km.position, m_camera); + m_labels.reserve(wrecks.size()); + for (const auto& wreck : wrecks) { + const auto pos = GetWorldToScreen(wreck.position, m_camera); const float depth = std::sqrt( - std::pow(m_camera.position.x - km.position.x, 2) + - std::pow(m_camera.position.y - km.position.y, 2) + - std::pow(m_camera.position.z - km.position.z, 2)); + std::pow(m_camera.position.x - wreck.position.x, 2) + + std::pow(m_camera.position.y - wreck.position.y, 2) + + std::pow(m_camera.position.z - wreck.position.z, 2)); if (0 > pos.x || width < pos.x || 0 > pos.y || height < pos.y) continue; - const auto base = GetWorldToScreen({km.position.x, 0.0f, km.position.z}, m_camera); + const auto base = GetWorldToScreen({wreck.position.x, 0.0f, wreck.position.z}, m_camera); m_labels.push_back(Label{pos, base, depth}); } std::sort(m_labels.begin(), m_labels.end(), [](auto& a, auto& b){ return a.depth > b.depth; }); diff --git a/View.h b/View.h index 8e247d1..1928726 100644 --- a/View.h +++ b/View.h @@ -1,23 +1,22 @@ #pragma once -#include #include #include +#include "Grid.h" #include "Label.h" -#include "Source.h" class View { public: - explicit View(std::unique_ptr source); + explicit View(std::vector grids); void update(float dt); void draw() const; private: Camera m_camera; - std::unique_ptr m_source; + std::vector m_grids; std::vector