summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)
{