summaryrefslogtreecommitdiff
path: root/utility/maths.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'utility/maths.cpp')
-rw-r--r--utility/maths.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/utility/maths.cpp b/utility/maths.cpp
index 0bd3eac..74a3085 100644
--- a/utility/maths.cpp
+++ b/utility/maths.cpp
@@ -3,6 +3,8 @@
#include <glm/glm.hpp>
#include <glm/gtx/rotate_vector.hpp>
#include <glm/gtx/transform.hpp>
+#include <initializer_list>
+#include <stdexcept>
glm::mat4
flat_orientation(const glm::vec3 & diff)
@@ -57,3 +59,29 @@ Arc::Arc(const glm::vec3 & centre3, const glm::vec3 & e0p, const glm::vec3 & e1p
}())
{
}
+
+std::pair<glm::vec2, bool>
+find_arc_centre(glm::vec2 as, float entrys, glm::vec2 bs, float entrye)
+{
+ if (as == bs) {
+ return {as, false};
+ }
+ for (const auto lr : {1.F, -1.F}) { // left or right turn (maybe possible with removal of positve check below)
+ const auto perps = entrys + (half_pi * lr);
+ const auto perpe = entrye - (half_pi * lr);
+ const glm::vec2 ad {std::sin(perps), std::cos(perps)};
+ const glm::vec2 bd {std::sin(perpe), std::cos(perpe)};
+
+ const auto dx = bs.x - as.x;
+ const auto dy = bs.y - as.y;
+ const auto det = bd.x * ad.y - bd.y * ad.x;
+ if (det != 0) { // near parallel line will yield noisy results
+ const auto u = (dy * bd.x - dx * bd.y) / det;
+ const auto v = (dy * ad.x - dx * ad.y) / det;
+ if (u >= 0 && v >= 0) {
+ return {as + ad * u, lr < 0};
+ }
+ }
+ }
+ throw std::runtime_error("no intersection");
+}