diff --git a/libs/geom/include/psemek/geom/vector.hpp b/libs/geom/include/psemek/geom/vector.hpp index 55ea1e42..247e5fb6 100644 --- a/libs/geom/include/psemek/geom/vector.hpp +++ b/libs/geom/include/psemek/geom/vector.hpp @@ -234,12 +234,6 @@ namespace psemek::geom } // TODO: generic implementation (shares internals with det) - template - vector ort(vector const & v0) - { - return {-v0[1], v0[0]}; - } - template vector ort(vector const & v0, vector const & v1) { @@ -250,6 +244,40 @@ namespace psemek::geom }; } + // Any vector orthogonal to v + // N.B.: discontinuous in odd dimensions + template + vector ort(vector const & v) + { + vector result; + if constexpr ((N % 2) == 0) + { + for (std::size_t i = 0; i < N; i += 2) + { + result[i] = -v[i + 1]; + result[i + 1] = v[i]; + } + } + else + { + std::size_t i = 0, j = 1; + + for (std::size_t k = 1; k < N; ++k) + { + if (std::abs(v[k]) > std::abs(v[i])) + { + j = i; + i = k; + } + } + + result = vector::zero(); + result[i] = -v[j]; + result[j] = v[i]; + } + return result; + } + template vector cross(vector const & v0, vector const & v1) {