5namespace wmtk::utils::predicates {
14enum class Orientation {
47int orient2d_sign(
double ax,
double ay,
double bx,
double by,
double cx,
double cy);
62inline Orientation from_sign(
const int s)
64 return s > 0 ? Orientation::POSITIVE : (s < 0 ? Orientation::NEGATIVE : Orientation::COLLINEAR);
77inline void exactinit() {}
85template <
typename D0,
typename D1,
typename D2>
86inline Orientation orient2d(
87 const Eigen::MatrixBase<D0>& a,
88 const Eigen::MatrixBase<D1>& b,
89 const Eigen::MatrixBase<D2>& c)
91 return detail::from_sign(detail::orient2d_sign(a[0], a[1], b[0], b[1], c[0], c[1]));
106template <
typename D0,
typename D1,
typename D2,
typename D3>
107inline Orientation orient3d(
108 const Eigen::MatrixBase<D0>& a,
109 const Eigen::MatrixBase<D1>& b,
110 const Eigen::MatrixBase<D2>& c,
111 const Eigen::MatrixBase<D3>& d)
113 return detail::from_sign(
115 orient3d_sign(a[0], a[1], a[2], b[0], b[1], b[2], c[0], c[1], c[2], d[0], d[1], d[2]));
121template <
typename D0,
typename D1,
typename D2>
122inline bool is_degenerate(
123 const Eigen::MatrixBase<D0>& v0,
124 const Eigen::MatrixBase<D1>& v1,
125 const Eigen::MatrixBase<D2>& v2)
127 if constexpr (Eigen::MatrixBase<D0>::RowsAtCompileTime == 3) {
130 for (
int dim = 0; dim < 3; ++dim) {
131 const Eigen::Vector2d p0(v0[dim], v0[(dim + 1) % 3]);
132 const Eigen::Vector2d p1(v1[dim], v1[(dim + 1) % 3]);
133 const Eigen::Vector2d p2(v2[dim], v2[(dim + 1) % 3]);
134 if (orient2d(p0, p1, p2) != Orientation::COLLINEAR) {
140 return orient2d(v0, v1, v2) == Orientation::COLLINEAR;
147template <
typename D0,
typename D1,
typename D2,
typename D3>
148inline bool is_degenerate(
149 const Eigen::MatrixBase<D0>& v0,
150 const Eigen::MatrixBase<D1>& v1,
151 const Eigen::MatrixBase<D2>& v2,
152 const Eigen::MatrixBase<D3>& v3)
154 return orient3d(v0, v1, v2, v3) == Orientation::COPLANAR;