From 4bea43dc4fa93730eef609f7e0a981a7f91dfc35 Mon Sep 17 00:00:00 2001 From: Yann Thierry-Mieg Date: Wed, 17 Oct 2018 20:14:45 +0200 Subject: [PATCH] a couple new useful primitives for working with distances --- DistUtil.cpp | 23 ++++++++++++++++++++++- DistUtil.h | 6 +++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/DistUtil.cpp b/DistUtil.cpp index ba4e120..95c9fb7 100644 --- a/DistUtil.cpp +++ b/DistUtil.cpp @@ -8,7 +8,12 @@ namespace sc2util { std::sort(units.begin(), units.end(), [start](const Unit * a, const Unit * b) { return DistanceSquared2D(start, a->pos) < DistanceSquared2D(start, b->pos); }); } - std::vector sortByDistanceTo(std::valarray matrix, int ti, size_t sz) { + void sortByDistanceTo(std::vector& units, const sc2::Point2D & start) + { + std::sort(units.begin(), units.end(), [start](const auto & a, const auto & b) { return DistanceSquared2D(start, a) < DistanceSquared2D(start, b); }); + } + + std::vector sortByDistanceTo(const std::valarray & matrix, int ti, size_t sz) { std::vector byDist; for (int i = 0; i < sz; i++) { byDist.push_back(i); @@ -17,6 +22,22 @@ namespace sc2util { return byDist; } + std::valarray computeDistanceMatrix(const Units & units) { + auto sz = units.size(); + std::valarray matrix(sz *sz); // no more, no less, than a matrix + + for (int i = 0; i < sz; i++) { + // set diagonal to 0 + matrix[i*sz + i] = 0; + for (int j = i + 1; j < sz; j++) { + auto d = DistanceSquared2D(units[i]->pos, units[j]->pos); + matrix[i*sz + j] = d; + matrix[j*sz + i] = d; + } + } + return matrix; + } + std::valarray computeDistanceMatrix(const std::vector & expansions, QueryInterface * query) { std::vector queries; auto sz = expansions.size(); diff --git a/DistUtil.h b/DistUtil.h index a3b0f16..c65ac19 100644 --- a/DistUtil.h +++ b/DistUtil.h @@ -6,10 +6,14 @@ namespace sc2util { // basic sorting, updates units void sortByDistanceTo(sc2::Units & units, const sc2::Point2D & start); + // basic sorting, updates units + void sortByDistanceTo(std::vector & units, const sc2::Point2D & start); // sorting using a distance matrix, with respect to one element ti - std::vector sortByDistanceTo(std::valarray matrix, int ti, size_t sz); + std::vector sortByDistanceTo(const std::valarray & matrix, int ti, size_t sz); // computing a distance matrix, with actual pathing queries std::valarray computeDistanceMatrix(const std::vector & expansions, sc2::QueryInterface * query); + // compute a distance matrix, bird view + std::valarray computeDistanceMatrix(const sc2::Units & expansions); // utility for center of gravity const sc2::Point2D cog(const std::vector& points); // default max is quite large, it amounts to roughly 15 game unit i.e. a circle roughly the surface of a base