libigl v2.5.0
Loading...
Searching...
No Matches
BinaryWindingNumberOperations.h
Go to the documentation of this file.
1// This file is part of libigl, a simple c++ geometry processing library.
2//
3// Copyright (C) 2015 Qingnan Zhou <qnzhou@gmail.com>
4//
5// This Source Code Form is subject to the terms of the Mozilla Public License
6// v. 2.0. If a copy of the MPL was not distributed with this file, You can
7// obtain one at http://mozilla.org/MPL/2.0/.
8//
9#ifndef IGL_COPYLEFT_CGAL_BINARY_WINDING_NUMBER_OPERATIONS_H
10#define IGL_COPYLEFT_CGAL_BINARY_WINDING_NUMBER_OPERATIONS_H
11
12#include <stdexcept>
13#include "../../igl_inline.h"
15#include <Eigen/Core>
16#include <cassert>
17
18// TODO: This is not written according to libigl style. These should be
19// function handles.
20//
21// Why is this templated on DerivedW
22//
23// These are all generalized to n-ary operations
24namespace igl
25{
26 namespace copyleft
27 {
28 namespace cgal
29 {
31 template <igl::MeshBooleanType Op>
33 public:
34 template<typename DerivedW>
35 typename DerivedW::Scalar operator()(
36 const Eigen::MatrixBase<DerivedW>& /*win_nums*/) const {
37 throw (std::runtime_error("not implemented!"));
38 }
39 };
40
42 template <>
44 public:
45 template<typename DerivedW>
46 typename DerivedW::Scalar operator()(
47 const Eigen::MatrixBase<DerivedW>& win_nums) const
48 {
49 for(int i = 0;i<win_nums.size();i++)
50 {
51 if(win_nums(i) > 0) return true;
52 }
53 return false;
54 }
55 };
56
58 template <>
60 public:
61 template<typename DerivedW>
62 typename DerivedW::Scalar operator()(
63 const Eigen::MatrixBase<DerivedW>& win_nums) const
64 {
65 for(int i = 0;i<win_nums.size();i++)
66 {
67 if(win_nums(i)<=0) return false;
68 }
69 return true;
70 }
71 };
72
74 template <>
76 public:
77 template<typename DerivedW>
78 typename DerivedW::Scalar operator()(
79 const Eigen::MatrixBase<DerivedW>& win_nums) const
80 {
81 assert(win_nums.size()>1);
82 // Union of objects 1 through n-1
83 bool union_rest = false;
84 for(int i = 1;i<win_nums.size();i++)
85 {
86 union_rest = union_rest || win_nums(i) > 0;
87 if(union_rest) break;
88 }
89 // Must be in object 0 and not in union of objects 1 through n-1
90 return win_nums(0) > 0 && !union_rest;
91 }
92 };
93
95 template <>
97 public:
98 template<typename DerivedW>
99 typename DerivedW::Scalar operator()(
100 const Eigen::MatrixBase<DerivedW>& win_nums) const
101 {
102 // If inside an odd number of objects
103 int count = 0;
104 for(int i = 0;i<win_nums.size();i++)
105 {
106 if(win_nums(i) > 0) count++;
107 }
108 return count % 2 == 1;
109 }
110 };
111
113 template <>
115 public:
116 template<typename DerivedW>
117 typename DerivedW::Scalar operator()(
118 const Eigen::MatrixBase<DerivedW>& /*win_nums*/) const {
119 return true;
120 }
121 };
122
128
136
138 template<KeeperType T>
140 public:
141 template<typename DerivedW>
143 const Eigen::MatrixBase<DerivedW>& /*win_nums*/) const {
144 throw std::runtime_error("Not implemented");
145 }
146 };
147
149 template<>
151 public:
152 template<typename T>
153 short operator()(T out_w, T in_w) const {
154 if (in_w > 0 && out_w <= 0) return 1;
155 else if (in_w <= 0 && out_w > 0) return -1;
156 else return 0;
157 }
158 };
159
161 template<>
163 public:
164 template<typename T>
165 short operator()(T /*out_w*/, T /*in_w*/) const {
166 return 1;
167 }
168 };
169
172 }
173 }
174}
175
176#endif
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &win_nums) const
Definition BinaryWindingNumberOperations.h:62
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &win_nums) const
Definition BinaryWindingNumberOperations.h:78
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &) const
Definition BinaryWindingNumberOperations.h:117
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &win_nums) const
Definition BinaryWindingNumberOperations.h:46
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &win_nums) const
Definition BinaryWindingNumberOperations.h:99
Binary winding number operations.
Definition BinaryWindingNumberOperations.h:32
DerivedW::Scalar operator()(const Eigen::MatrixBase< DerivedW > &) const
Definition BinaryWindingNumberOperations.h:35
short operator()(T, T) const
Definition BinaryWindingNumberOperations.h:165
short operator()(T out_w, T in_w) const
Definition BinaryWindingNumberOperations.h:153
Filter winding numbers according to keep policy.
Definition BinaryWindingNumberOperations.h:139
short operator()(const Eigen::MatrixBase< DerivedW > &) const
Definition BinaryWindingNumberOperations.h:142
Definition assign.h:19
BinaryWindingNumberOperations< MESH_BOOLEAN_TYPE_INTERSECT > BinaryIntersect
Definition BinaryWindingNumberOperations.h:124
BinaryWindingNumberOperations< MESH_BOOLEAN_TYPE_UNION > BinaryUnion
Definition BinaryWindingNumberOperations.h:123
KeeperType
Types of Keep policies.
Definition BinaryWindingNumberOperations.h:130
@ KEEP_ALL
Keep everything.
Definition BinaryWindingNumberOperations.h:134
@ KEEP_INSIDE
Keep only inside.
Definition BinaryWindingNumberOperations.h:132
WindingNumberFilter< KEEP_INSIDE > KeepInside
Definition BinaryWindingNumberOperations.h:170
WindingNumberFilter< KEEP_ALL > KeepAll
Definition BinaryWindingNumberOperations.h:171
BinaryWindingNumberOperations< MESH_BOOLEAN_TYPE_RESOLVE > BinaryResolve
Definition BinaryWindingNumberOperations.h:127
BinaryWindingNumberOperations< MESH_BOOLEAN_TYPE_XOR > BinaryXor
Definition BinaryWindingNumberOperations.h:126
BinaryWindingNumberOperations< MESH_BOOLEAN_TYPE_MINUS > BinaryMinus
Definition BinaryWindingNumberOperations.h:125
Definition assign.h:17
Definition AABB.h:18
@ MESH_BOOLEAN_TYPE_MINUS
A \ B.
Definition MeshBooleanType.h:20
@ MESH_BOOLEAN_TYPE_XOR
A ⊕ B.
Definition MeshBooleanType.h:22
@ MESH_BOOLEAN_TYPE_INTERSECT
A ∩ B.
Definition MeshBooleanType.h:18
@ MESH_BOOLEAN_TYPE_UNION
A ∪ B.
Definition MeshBooleanType.h:16
@ MESH_BOOLEAN_TYPE_RESOLVE
Resolve intersections without removing any non-coplanar faces.
Definition MeshBooleanType.h:24
void count(const Eigen::SparseMatrix< XType > &X, const int dim, Eigen::SparseVector< SType > &S)
Count the number of non-zeros in the columns or rows of a sparse matrix.