3#include <igl/predicates/predicates.h>
5#include <wmtk/utils/Logger.hpp>
6#include <wmtk/utils/Rational.hpp>
11using MatrixX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
13using MatrixXd = MatrixX<double>;
14using MatrixXi = MatrixX<int>;
15using MatrixXr = MatrixX<Rational>;
16using Matrix4d = Eigen::Matrix4d;
18template <
typename T,
int R>
19using Vector = Eigen::Matrix<T, R, 1>;
21using VectorX = Vector<T, Eigen::Dynamic>;
23using Vector2d = Vector<double, 2>;
24using Vector3d = Vector<double, 3>;
25using Vector4d = Vector<double, 4>;
26using VectorXd = Vector<double, Eigen::Dynamic>;
28using Vector2r = Vector<Rational, 2>;
29using Vector3r = Vector<Rational, 3>;
31using Vector2i = Vector<int, 2>;
32using Vector3i = Vector<int, 3>;
33using Vector4i = Vector<int, 4>;
34using VectorXi = Vector<int, Eigen::Dynamic>;
36inline Vector3r to_rational(
const Vector3d& p0)
38 Vector3r p(p0[0], p0[1], p0[2]);
42inline Vector3d to_double(
const Vector3r& p0)
44 Vector3d p(p0[0].to_double(), p0[1].to_double(), p0[2].to_double());
48inline Vector4d to_homogenuous(
const Vector3d& x)
50 return Vector4d(x[0], x[1], x[2], 1);
53inline Vector3d from_homogenuous(
const Vector4d& x)
55 return Vector3d(x[0] / x[3], x[1] / x[3], x[2] / x[3]);
58using V_MAP = Eigen::Map<
const Eigen::Matrix<double, -1, -1, Eigen::RowMajor>>;
59using F_MAP = Eigen::Map<
const Eigen::Matrix<int, -1, -1, Eigen::RowMajor>>;
61inline void vectors_to_VF(
62 const std::vector<Vector3d>& vertices,
63 const std::vector<std::array<size_t, 3>>& faces,
67 V.resize(vertices.size(), 3);
68 F.resize(faces.size(), 3);
70 for (
int i = 0; i < V.rows(); i++) {
71 V.row(i) = vertices[i];
73 for (
int i = 0; i < F.rows(); i++) {
74 F.row(i) = Vector3i((
int)faces[i][0], (
int)faces[i][1], (
int)faces[i][2]);
78inline void VF_to_vectors(
81 std::vector<Vector3d>& vertices,
82 std::vector<std::array<size_t, 3>>& faces)
84 vertices.resize(V.rows());
85 faces.resize(F.rows());
87 for (
int i = 0; i < V.rows(); i++) {
88 vertices[i] = V.row(i);
90 for (
int i = 0; i < F.rows(); i++) {
91 faces[i][0] = F(i, 0);
92 faces[i][1] = F(i, 1);
93 faces[i][2] = F(i, 2);
98tet_is_inverted(
const Vector3d& v0,
const Vector3d& v1,
const Vector3d& v2,
const Vector3d& v3)
100 igl::predicates::exactinit();
101 auto res = igl::predicates::orient3d(v0, v1, v2, v3);
103 if (res == igl::predicates::Orientation::POSITIVE)
105 else if (res == igl::predicates::Orientation::NEGATIVE)
115inline bool tri_is_inverted(
const Vector2d& v0,
const Vector2d& v1,
const Vector2d& v2)
117 igl::predicates::exactinit();
118 auto res = igl::predicates::orient2d(v0, v1, v2);
120 if (res == igl::predicates::Orientation::POSITIVE)
122 else if (res == igl::predicates::Orientation::NEGATIVE)
137inline bool VF_rational_to_double(
const MatrixXr& V_in,
const MatrixXi& F, MatrixXd& V_out)
139 V_out.resizeLike(V_in);
140 for (
int i = 0; i < V_in.size(); ++i) {
141 V_out(i) = V_in(i).to_double();
147 for (
int i = 0; i < F.rows(); ++i) {
148 const auto& s = F.row(i);
149 if (tri_is_inverted(V_out.row(s[0]), V_out.row(s[1]), V_out.row(s[2]))) {
153 }
else if (F.cols() == 4) {
155 for (
int i = 0; i < F.rows(); ++i) {
156 const auto& s = F.row(i);
166 log_and_throw_error(
"Unknown dimension in VF_rational_to_double");