summaryrefslogtreecommitdiffhomepage
path: root/Reader.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-05-15 15:37:59 +0200
committerAki <please@ignore.pl>2022-05-15 15:37:59 +0200
commit345bb237a7f682670a6107ae75afd948cc1f6ab6 (patch)
treefd4d2982d33c837bd7c4079e41434bbbf3ec8f8a /Reader.cpp
parent1b61e9b2b8c3b2218ec5a908a547180a642719e6 (diff)
downloadderelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.zip
derelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.tar.gz
derelict-345bb237a7f682670a6107ae75afd948cc1f6ab6.tar.bz2
Separated Wreck from Killmail
Diffstat (limited to 'Reader.cpp')
-rw-r--r--Reader.cpp67
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();
+}