diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-05-10 12:52:50 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-05-10 12:52:50 +0100 |
commit | ea0453f520a787dddff11d389683a255aed73ca7 (patch) | |
tree | ebbdd847e6892a8c9e72aca7f08dc039ca21497f | |
parent | Fix all warnings in test/ (diff) | |
download | ilt-ea0453f520a787dddff11d389683a255aed73ca7.tar.bz2 ilt-ea0453f520a787dddff11d389683a255aed73ca7.tar.xz ilt-ea0453f520a787dddff11d389683a255aed73ca7.zip |
Simplified genCurveDef for 1 direction
Uses new find_arc_centre for 1 direction which doesn't break for 180
degree solutions.
-rw-r--r-- | game/network/network.cpp | 5 | ||||
-rw-r--r-- | lib/maths.h | 15 |
2 files changed, 16 insertions, 4 deletions
diff --git a/game/network/network.cpp b/game/network/network.cpp index c8482de..23d39af 100644 --- a/game/network/network.cpp +++ b/game/network/network.cpp @@ -99,12 +99,9 @@ Network::routeFromTo(const Link::End & end, const Node::Ptr & dest) GenCurveDef Network::genCurveDef(const GlobalPosition3D & start, const GlobalPosition3D & end, float startDir) { - const auto diff = difference(end, start); - const auto yaw = vector_yaw(diff); const auto dir = pi + startDir; const auto flatStart = start.xy(), flatEnd = end.xy(); - const auto n2ed = (yaw * 2) - dir - pi; - const auto centre = find_arc_centre(flatStart, dir, flatEnd, n2ed); + const auto centre = find_arc_centre(flatStart, dir, flatEnd); if (centre.second) { // right hand arc return {end, start, centre.first}; diff --git a/lib/maths.h b/lib/maths.h index 43d6dcd..68b45da 100644 --- a/lib/maths.h +++ b/lib/maths.h @@ -427,6 +427,21 @@ find_arc_centre(glm::vec<2, T, Q> start, Angle entrys, glm::vec<2, T, Q> end, An } template<Arithmetic T, glm::qualifier Q = glm::defaultp> +std::pair<glm::vec<2, T, Q>, bool> +find_arc_centre(glm::vec<2, T, Q> start, Angle entrys, glm::vec<2, T, Q> end) +{ + if (start == end) { + return {start, false}; + } + const auto startNormal = vector_normal(sincos(entrys) * 10'000.F); + const auto diffEnds = difference(end, start); + const auto midEnds = start + ((end - start) / 2); + const auto diffNormal = vector_normal(diffEnds); + const auto centre = linesIntersectAt(start, start + startNormal, midEnds, midEnds + diffNormal); + return {*centre, normalize(vector_yaw(diffEnds) - entrys) < 0}; +} + +template<Arithmetic T, glm::qualifier Q = glm::defaultp> Angle find_arcs_radius(glm::vec<2, T, Q> start, Rotation2D ad, glm::vec<2, T, Q> end, Rotation2D bd) { |