summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-05-10 12:52:50 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2025-05-10 12:52:50 +0100
commitea0453f520a787dddff11d389683a255aed73ca7 (patch)
treeebbdd847e6892a8c9e72aca7f08dc039ca21497f
parentFix all warnings in test/ (diff)
downloadilt-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.cpp5
-rw-r--r--lib/maths.h15
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)
{