summaryrefslogtreecommitdiff
path: root/lib/ray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ray.cpp')
-rw-r--r--lib/ray.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/ray.cpp b/lib/ray.cpp
new file mode 100644
index 0000000..1e30ae4
--- /dev/null
+++ b/lib/ray.cpp
@@ -0,0 +1,18 @@
+#include "ray.hpp"
+
+float
+Ray::distanceToLine(const glm::vec3 & p1, const glm::vec3 & e1) const
+{
+ // https://en.wikipedia.org/wiki/Skew_lines
+ const auto diff = p1 - e1;
+ const auto d1 = glm::normalize(diff);
+ const auto &p2 = start, &d2 = direction;
+ const auto n = glm::cross(d1, d2);
+ const auto n2 = glm::cross(d2, n);
+ const auto c1 = p1 + (glm::dot((p2 - p1), n2) / glm::dot(d1, n2)) * d1;
+ const auto difflength = glm::length(diff);
+ if (glm::length(c1 - p1) > difflength || glm::length(c1 - e1) > difflength) {
+ return std::numeric_limits<float>::infinity();
+ }
+ return glm::abs(glm::dot(n, p1 - p2));
+}