summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test_vec.cpp12
-rw-r--r--vec.h9
2 files changed, 21 insertions, 0 deletions
diff --git a/test_vec.cpp b/test_vec.cpp
index 1c9390f..a81ee09 100644
--- a/test_vec.cpp
+++ b/test_vec.cpp
@@ -117,4 +117,16 @@ TEST(Vec, Refract) {
TEST(Vec, Refract_TIR) {
vec3d n{1, 0, 0}, u{-1, 0, -sqrt(3)}, v{1, 0, -sqrt(3)};
ASSERT_EQ(v.unit_vec(), n.refract<true>(u.unit_vec(), 2));
+}
+
+TEST(Vec, VecParallel) {
+ vec3d a{1, 1, 2}, b{1.1, 1.1, 2.2}, c{0,0,0}, d{1, 2, 1};
+ ASSERT_TRUE(a.parallel(b));
+ ASSERT_TRUE(b.parallel(a));
+ ASSERT_TRUE(a.parallel(c));
+ ASSERT_TRUE(c.parallel(a));
+ ASSERT_FALSE(a.parallel(d));
+ ASSERT_FALSE(d.parallel(a));
+ ASSERT_FALSE(b.parallel(d));
+ ASSERT_FALSE(d.parallel(b));
} \ No newline at end of file
diff --git a/vec.h b/vec.h
index 84cbaa3..11b9bd3 100644
--- a/vec.h
+++ b/vec.h
@@ -109,6 +109,15 @@ struct vec3 {
return std::isfinite(x) && std::isfinite(y) && std::isfinite(z);
}
+ // Determine if this vector is parallel with another one.
+ bool parallel(const vec3 &other) const {
+ const auto dt = dot(other);
+ const auto dot2 = dt * dt;
+ const auto sqlp = mod2() * other.mod2(); // squared length product
+ const auto d = dot2 - sqlp;
+ return d > -1e-6 && d < 1e-6;
+ }
+
// Get the reflected vector. Current vector is the normal vector (length should be 1), v is the incoming vector.
vec3 reflect(const vec3 &v) const {
assert(fabs(mod2() - 1.0) < 1e-8);