Geogram Version 1.9.8
A programming library of geometric algorithms
Loading...
Searching...
No Matches
mesh_surface_intersection.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2000-2022 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * * Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * * Neither the name of the ALICE Project-Team nor the names of its
14 * contributors may be used to endorse or promote products derived from this
15 * software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
21 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Contact: Bruno Levy
30 *
31 * https://www.inria.fr/fr/bruno-levy
32 *
33 * Inria,
34 * Domaine de Voluceau,
35 * 78150 Le Chesnay - Rocquencourt
36 * FRANCE
37 *
38 */
39
40#ifndef GEOGRAM_MESH_MESH_SURFACE_INTERSECTION
41#define GEOGRAM_MESH_MESH_SURFACE_INTERSECTION
42
44#include <geogram/mesh/mesh.h>
49#include <geogram/basic/debug_stream.h>
50#include <functional>
51
58namespace GEO {
59
60 struct IsectInfo;
61
62 /********************************************************************/
63
68 class GEOGRAM_API MeshSurfaceIntersection {
69 public:
70
72
75
83 void intersect();
84
90
96
97
98 void remove_fins();
99
123 void classify(const std::string& expr);
124
125
134
148 index_t component, index_t v
149 );
150
162 index_t component, index_t v
163 );
164
165
172 void simplify_coplanar_facets(double angle_tolerance = 0.0);
173
178 void set_verbose(bool x) {
179 verbose_ = x;
180 if(!verbose_ && fine_verbose_) {
181 fine_verbose_ = false;
182 }
183 }
184
189 void set_fine_verbose(bool x) {
190 fine_verbose_ = x;
191 if(fine_verbose_ && !verbose_) {
192 verbose_ = true;
193 }
194 }
195
204 monster_threshold_ = nb;
205 }
206
212 void set_dry_run(bool x) {
213 dry_run_ = x;
214 }
215
222 void set_delaunay(bool x) {
223 delaunay_ = x;
224 }
225
232 detect_intersecting_neighbors_ = x;
233 }
234
242 void set_radial_sort(bool x) {
243 use_radial_sort_ = x;
244 }
245
253 void set_normalize(bool x) {
254 normalize_ = x;
255 }
256
257
267 void set_build_skeleton(Mesh* skeleton, bool trim_fins=false) {
268 skeleton_ = skeleton;
269 skeleton_trim_fins_ = trim_fins;
270 }
271
278 interpolate_attributes_ = x;
279 }
280
281 protected:
291
306
325
341 void intersect_epilogue(const vector<IsectInfo>& intersections);
342
343
352 void lock() {
353 Process::acquire_spinlock(lock_);
354 }
355
359 void unlock() {
360 Process::release_spinlock(lock_);
361 }
362
373
385
392 return mesh_;
393 }
394
400 const Mesh& target_mesh() const {
401 return mesh_;
402 }
403
416 const Mesh& readonly_mesh() const {
417 return mesh_copy_;
418 }
419
420 class RadialSort;
421
432
436 void mark_external_shell(vector<index_t>& on_external_shell);
437
438 protected:
439
443 class GEOGRAM_API RadialSort {
444 public:
450 const MeshSurfaceIntersection& mesh
451 ) : mesh_(mesh),
452 h_ref_(NO_INDEX),
453 degenerate_(false)
454 {
455 }
456
461 void init(index_t h_ref);
462
469 bool operator()(index_t h1, index_t h2) const;
470
477 bool degenerate() const {
478 return degenerate_;
479 }
480
489 const ExactPoint& p1, const ExactPoint& p2
490 );
491
500 const ExactPoint& p1, const ExactPoint& p2
501 );
502
503 protected:
504
514
522
523 public:
524 void test(index_t h1, index_t h2) {
525 (*this)(h1,h2);
526 Sign o_ref1 = h_orient(h_ref_, h1);
527 Sign o_ref2 = h_orient(h_ref_, h2);
528 Sign oN_ref1 = h_refNorient(h1);
529 Sign oN_ref2 = h_refNorient(h2);
530 Sign o_12 = h_orient(h1,h2);
531 std::cerr
532 << " o_ref1=" << int(o_ref1) << " o_ref2=" << int(o_ref2)
533 << " oN_ref1=" << int(oN_ref1) << " oN_ref2=" << int(oN_ref2)
534 << " o_12=" << int(o_12)
535 << std::endl;
536 }
537
538
539 // private:
540 const MeshSurfaceIntersection& mesh_;
541 private:
542 index_t h_ref_; // ---reference halfedge
543 exact::vec3 U_ref_; // -.
544 exact::vec3 V_ref_; // +-reference basis
545 exact::vec3 N_ref_; // -'
546 vec3I U_ref_I_; // -.
547 vec3I V_ref_I_; // +-reference basis (interval arithmetics)
548 vec3I N_ref_I_; // _'
549 mutable vector< std::pair<index_t, Sign> > refNorient_cache_;
550 mutable bool degenerate_;
551 };
552
553
554 protected:
555 Process::spinlock lock_;
556 Mesh& mesh_;
557 Mesh mesh_copy_;
558 Attribute<const ExactPoint*> vertex_to_exact_point_;
559
560#if defined(GEOGRAM_USE_EXACT_NT) && defined(GEOGRAM_EXACT_NT_IS_MPF_NT)
561 // Exact points are canonicalized
562 // (by Numeric::optimize_number_representation(vec3HEx)) so
563 // we can use this comparator that makes the global vertex map
564 // much much faster.
565 typedef vec3HExLexicoCompareCanonical ExactPointCompare;
566#else
567 // Generic comparator for global vertex map.
568 typedef vec3HgLexicoCompare<exact::scalar> ExactPointCompare;
569#endif
570 std::map<ExactPoint,index_t,ExactPointCompare> exact_point_to_vertex_;
571
572 bool verbose_;
573 bool fine_verbose_;
574 bool delaunay_;
575 bool detect_intersecting_neighbors_;
576 bool use_radial_sort_;
577
578 PCK::SOSMode SOS_bkp_;
579 bool rescale_;
580 bool normalize_;
581 vec3 normalize_center_;
582 double normalize_radius_;
583
584 index_t monster_threshold_;
585 bool dry_run_;
586 friend class MeshInTriangle;
587 friend class CoplanarFacets;
588
589 Mesh* skeleton_;
590 bool skeleton_trim_fins_;
591 bool interpolate_attributes_;
592
593 /***************************************************/
594
603 class Halfedges {
604 public:
605
610 Halfedges(MeshSurfaceIntersection& I) : mesh_(I.mesh_) {
611 }
612
617 // TODO: destroy alpha3 attribute (kept now for debugging
618 }
619
624 void initialize() {
625 facet_corner_alpha3_.bind(
626 mesh_.facet_corners.attributes(), "alpha3"
627 );
628 }
629
635 index_t nb() const {
636 return mesh_.facet_corners.nb();
637 }
638
644 return index_as_iterator(0);
645 }
646
652 return index_as_iterator(nb());
653 }
654
661 return h/3;
662 }
663
674 index_t t1 = facet(h);
675 index_t t2 = mesh_.facet_corners.adjacent_facet(h);
676 if(t2 == NO_INDEX) {
677 return NO_INDEX;
678 }
679 for(index_t h2: mesh_.facets.corners(t2)) {
680 if(mesh_.facet_corners.adjacent_facet(h2) == t1) {
681 return h2;
682 }
683 }
685 }
686
697 return facet_corner_alpha3_[h];
698 }
699
707 return alpha3(3*f)/3;
708 }
709
721 index_t f = h/3;
722 index_t lv = (h+dlv)%3;
723 return mesh_.facets.vertex(f,lv);
724 }
725
726
735 void sew2(index_t h1, index_t h2) {
736 geo_debug_assert(vertex(h1,0) == vertex(h2,1));
737 geo_debug_assert(vertex(h2,0) == vertex(h1,1));
738 index_t t1 = h1/3;
739 index_t t2 = h2/3;
740 mesh_.facet_corners.set_adjacent_facet(h1,t2);
741 mesh_.facet_corners.set_adjacent_facet(h2,t1);
742 }
743
752 void sew3(index_t h1, index_t h2) {
753 geo_debug_assert(vertex(h1,0) == vertex(h2,1));
754 geo_debug_assert(vertex(h2,0) == vertex(h1,1));
755 facet_corner_alpha3_[h1] = h2;
756 facet_corner_alpha3_[h2] = h1;
757 }
758
759 private:
760 Mesh& mesh_;
761 Attribute<index_t> facet_corner_alpha3_;
762 } halfedges_;
763
764 /***************************************************/
765
772 public:
773
778 RadialBundles(MeshSurfaceIntersection& I) : I_(I), mesh_(I.mesh_) {
779 }
780
786
790 index_t nb() const {
791 return bndl_start_.size() - 1;
792 }
793
799 return index_as_iterator(0);
800 }
801
807 return index_as_iterator(nb());
808 }
809
816 geo_debug_assert(bndl < nb());
817 return bndl_start_[bndl+1] - bndl_start_[bndl];
818 }
819
827 index_t halfedge(index_t bndl, index_t li) const {
828 geo_debug_assert(bndl < nb());
829 geo_debug_assert(li < nb_halfedges(bndl));
830 return H_[bndl_start_[bndl] + li];
831 }
832
841 geo_debug_assert(bndl < nb());
842 geo_debug_assert(li < nb_halfedges(bndl));
843 H_[bndl_start_[bndl] + li] = h;
844 }
845
852 return index_ptr_range(
853 H_, bndl_start_[bndl], bndl_start_[bndl+1]
854 );
855 }
856
864 H_, bndl_start_[bndl], bndl_start_[bndl+1]
865 );
866 }
867
875 index_t vertex(index_t bndl, index_t lv) const {
876 geo_debug_assert(bndl_start_[bndl+1] - bndl_start_[bndl] > 0);
877 index_t h = H_[bndl_start_[bndl]];
878 return I_.halfedges_.vertex(h,lv);
879 }
880
889 return v_first_bndl_[v];
890 }
891
900 return bndl_next_around_v_[bndl];
901 }
902
909 index_t result = 0;
910 for(
911 index_t bndl = vertex_first_bundle(v);
912 bndl != NO_INDEX;
913 bndl = next_around_vertex(bndl)
914 ) {
915 ++result;
916 }
917 return result;
918 }
919
927 geo_debug_assert(bndl < nb());
928 return (bndl >= nb()/2) ? (bndl-nb()/2) : (bndl+nb()/2);
929 }
930
937 index_t v = vertex(bndl,0);
938 if(nb_bundles_around_vertex(v) != 2) {
939 return NO_INDEX;
940 }
941 for(
942 index_t bndl2 = vertex_first_bundle(v);
943 bndl2 != NO_INDEX; bndl2 = next_around_vertex(bndl2)
944 ) {
945 if(bndl2 != bndl) {
946 return opposite(bndl2);
947 }
948 }
950 }
951
958 index_t v = vertex(bndl,1);
959 if(nb_bundles_around_vertex(v) != 2) {
960 return NO_INDEX;
961 }
962 for(
963 index_t bndl2 = vertex_first_bundle(v);
964 bndl2 != NO_INDEX; bndl2 = next_around_vertex(bndl2)
965 ) {
966 if(opposite(bndl2) != bndl) {
967 return bndl2;
968 }
969 }
971 }
972
982 geo_debug_assert(bndl < nb());
983 if(nb_halfedges(bndl) <= 2) {
984 return true;
985 }
986 auto b = H_.begin() + std::ptrdiff_t(bndl_start_[bndl]);
987 auto e = H_.begin() + std::ptrdiff_t(bndl_start_[bndl+1]);
988 RS.init(*b);
989 std::sort(b, e, RS);
990 bool OK = !RS.degenerate();
991 bndl_is_sorted_[bndl] = OK;
992 return OK;
993 }
994
1004 index_t bndl, const vector<index_t>& halfedges
1005 ) {
1006 geo_debug_assert(halfedges.size() == nb_halfedges(bndl));
1007 for(index_t i=0; i<halfedges.size(); ++i) {
1008 set_halfedge(bndl, i, halfedges[i]);
1009 }
1010 bndl_is_sorted_[bndl] = true;
1011 }
1012
1018 typedef std::pair<index_t, index_t> ChartPos;
1019
1028 index_t bndl, vector<ChartPos>& chart_pos
1029 );
1030
1031 bool is_sorted(index_t bndl) const {
1032 geo_assert(bndl < nb());
1033 return bndl_is_sorted_[bndl];
1034 }
1035
1036 // private:
1038 Mesh& mesh_;
1039 Attribute<index_t> facet_chart_;
1040 vector<index_t> H_;
1041 vector<index_t> bndl_start_;
1042 vector<index_t> v_first_bndl_;
1043 vector<index_t> bndl_next_around_v_;
1044 vector<char> bndl_is_sorted_; // not vector<bool>, multithread! (#308)
1045 } radial_bundles_;
1046
1047 /***************************************************/
1048
1050 public:
1055 RadialPolylines(MeshSurfaceIntersection& I) : I_(I), mesh_(I.mesh_) {
1056 }
1057
1063
1070
1074 index_t nb() const {
1075 return polyline_start_.size() - 1;
1076 }
1077
1083 return index_as_iterator(0);
1084 }
1085
1091 return index_as_iterator(nb());
1092 }
1093
1100 geo_debug_assert(polyline < nb());
1101 return const_index_ptr_range(
1102 B_, polyline_start_[polyline], polyline_start_[polyline+1]
1103 );
1104 }
1105
1106 index_t nb_bundles(index_t polyline) const {
1107 geo_debug_assert(polyline < nb());
1108 return polyline_start_[polyline+1] - polyline_start_[polyline];
1109 }
1110
1111 index_t bundle(index_t polyline, index_t li) const {
1112 geo_debug_assert(polyline < nb());
1113 geo_debug_assert(li < nb_bundles(polyline));
1114 return B_[polyline_start_[polyline] + li];
1115 }
1116
1124 void get_skeleton(Mesh& to, bool trim_fins=false);
1125
1126 private:
1128 Mesh& mesh_;
1129 vector<index_t> B_;
1130 vector<index_t> polyline_start_;
1131 } radial_polylines_;
1132 };
1133
1134 /********************************************************************/
1135
1136 enum MeshBooleanOperationFlags {
1137 MESH_BOOL_OPS_DEFAULT = 0,
1138 MESH_BOOL_OPS_VERBOSE = 1,
1139 MESH_BOOL_OPS_ATTRIBS = 2,
1140 MESH_BOOL_OPS_NO_SIMPLIFY = 4
1141 };
1142
1156 void GEOGRAM_API mesh_boolean_operation(
1157 Mesh& result, const Mesh& A, const Mesh& B, const std::string& operation,
1158 MeshBooleanOperationFlags flags = MESH_BOOL_OPS_DEFAULT
1159 );
1160
1172 Mesh& result, const Mesh& A, const Mesh& B, const std::string& operation,
1173 bool verbose
1174 ) {
1176 result, A, B, operation,
1177 verbose ? MESH_BOOL_OPS_VERBOSE : MESH_BOOL_OPS_DEFAULT
1178 );
1179 }
1180
1193 inline void mesh_union(
1194 Mesh& result, const Mesh& A, const Mesh& B,
1195 MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT
1196 ) {
1197 mesh_boolean_operation(result, A, B, "A+B", flags);
1198 }
1199
1209 inline void mesh_union(
1210 Mesh& result, const Mesh& A, const Mesh& B, bool verbose
1211 ) {
1212 mesh_boolean_operation(result, A, B, "A+B", verbose);
1213 }
1214
1215
1229 Mesh& result, const Mesh& A, const Mesh& B,
1230 MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT
1231 ) {
1232 mesh_boolean_operation(result, A, B, "A*B", flags);
1233 }
1234
1245 Mesh& result, const Mesh& A, const Mesh& B, bool verbose
1246 ) {
1247 mesh_boolean_operation(result, A, B, "A*B", verbose);
1248 }
1249
1262 inline void mesh_difference(
1263 Mesh& result, const Mesh& A, const Mesh& B,
1264 MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT
1265 ) {
1266 mesh_boolean_operation(result, A, B, "A-B", flags);
1267 }
1268
1278 inline void mesh_difference(
1279 Mesh& result, const Mesh& A, const Mesh& B, bool verbose
1280 ) {
1281 mesh_boolean_operation(result, A, B, "A-B", verbose);
1282 }
1283
1291 Mesh& M, index_t max_iter = 3, bool verbose=false
1292 );
1293
1304 Mesh& M, index_t f1, index_t f2
1305 );
1306
1307 /**************************************************************************/
1308}
1309
1310#endif
#define geo_assert_not_reached
Sets a non reachable point in the program.
Definition assert.h:177
#define geo_assert(x)
Verifies that a condition is met.
Definition assert.h:149
#define geo_debug_assert(x)
Verifies that a condition is met.
Definition assert.h:196
Generic mechanism for attributes.
Manages an attribute attached to a set of object.
Detects and retriangulates a set of coplanar facets for MeshSurfaceIntersection.
index_t adjacent_facet(index_t c) const
Gets the facet that a corner is adjacent to.
Definition mesh.h:970
void set_adjacent_facet(index_t c, index_t f)
Sets the facet that a corner is adjacent to.
Definition mesh.h:1033
index_t vertex(index_t f, index_t lv) const
Gets a vertex by facet and local vertex index.
Definition mesh.h:1162
index_range corners(index_t f) const
Gets the corners of a facet.
Definition mesh.h:1557
Meshes a single triangle with the constraints that come from the intersections with the other triangl...
AttributesManager & attributes() const
Gets the attributes manager.
Definition mesh.h:109
index_t nb() const
Gets the number of (sub-)elements.
Definition mesh.h:98
Halfedfge-like API wrappers on top of a triangulated mesh.
index_t facet(index_t h) const
Gets the facet associated to a halfedge.
void sew2(index_t h1, index_t h2)
Creates a surfacic link between two halfedges.
void sew3(index_t h1, index_t h2)
Creates a volumetric link between two halfedges.
index_t alpha3(index_t h) const
gets the volumetric neighbor of a halfedge
index_t vertex(index_t h, index_t dlv) const
gets a vertex of an halfedge
index_t alpha2(index_t h) const
gets the surfacic neighbor of a halfedge
index_t facet_alpha3(index_t f) const
gets the volumetric neighbor of a facet
Halfedges(MeshSurfaceIntersection &I)
Halfedges constructor.
index_as_iterator begin() const
used by range-based for
index_t nb() const
Gets the number of halfedegs in the map.
index_as_iterator end() const
used by range-based for
Represents the set of radial halfedge bundles.
index_as_iterator begin() const
used by range-based for
index_t nb() const
Gets the number of bundles.
index_t vertex(index_t bndl, index_t lv) const
gets one of the vertices at the two extremities of a bundle
index_t vertex_first_bundle(index_t v) const
gets the first bundle starting from a vertex
void get_sorted_incident_charts(index_t bndl, vector< ChartPos > &chart_pos)
Gets the sorted list of charts around bundle.
index_as_iterator end() const
used by range-based for
const_index_ptr_range halfedges(index_t bndl) const
gets the halfedges in a bundle
index_t next_around_vertex(index_t bndl) const
gets the next bundle around a vertex
bool radial_sort(index_t bndl, RadialSort &RS)
Sorts the halfedges of the bundle in-place.
index_ptr_range halfedges(index_t bndl)
gets the halfedges in a bundle
index_t prev_along_polyline(index_t bndl)
gets the predecessor of a bundle along its polyline
index_t nb_halfedges(index_t bndl) const
Gets the number of halfedges in a bundle.
void initialize()
Initializes the structure.
index_t next_along_polyline(index_t bndl)
gets the successor of a bundle along its polyline
void set_sorted_halfedges(index_t bndl, const vector< index_t > &halfedges)
Sets the halfedges of a bundle.
std::pair< index_t, index_t > ChartPos
Indicates where to find a chart in a bundle.
index_t nb_bundles_around_vertex(index_t v) const
gets the bumber of bundles around a vertex
RadialBundles(MeshSurfaceIntersection &I)
RadialBundles constructor.
index_t opposite(index_t bndl)
gets the opposite bundle
index_t halfedge(index_t bndl, index_t li) const
Gets a halfedge in a bundle from local index.
void set_halfedge(index_t bndl, index_t li, index_t h)
Sets a halfedge in a bundle.
void radial_sort()
Sorts all the bundles of all polylines.
index_as_iterator begin() const
used by range-based for
const_index_ptr_range bundles(index_t polyline) const
gets the bundles in a polyline
void get_skeleton(Mesh &to, bool trim_fins=false)
Copies the set of polylines to a mesh.
void initialize()
Initializes the structure.
index_t nb() const
Gets the number of polylines.
index_as_iterator end() const
used by range-based for
RadialPolylines(MeshSurfaceIntersection &I)
RadialPolylines constructor.
Sign h_orient(index_t h1, index_t h2) const
Computes the relative orientations of two halfedges.
static exact::vec3 exact_direction(const ExactPoint &p1, const ExactPoint &p2)
Computes a vector of arbitrary length with its direction given by two points.
Sign h_refNorient(index_t h2) const
Computes the normal orientation of a halfedge relative to h_ref.
void init(index_t h_ref)
Initializes radial sorting around a given halfedge.
bool degenerate() const
Tests if a degeneracy was encountered.
RadialSort(const MeshSurfaceIntersection &mesh)
RadialSort constructor.
bool operator()(index_t h1, index_t h2) const
Compares two halfedges.
static vec3I exact_direction_I(const ExactPoint &p1, const ExactPoint &p2)
Computes an interval vector of arbitrary length with its direction given by two points.
Computes surface intersections.
void set_verbose(bool x)
Display information while computing the intersection. Default is unset.
index_t tentatively_classify_component_vertex_fast(index_t component, index_t v)
Classifies a vertex of the computed intersection.
void set_monster_threshold(index_t nb)
Sets the threshold from which triangle is considered to be a monster.
void simplify_coplanar_facets(double angle_tolerance=0.0)
Merge coplanar facets and retriangulate them using a Constrained Delaunay triangulation.
void remove_internal_shells()
Removes all the facets that are not on the outer boundary.
index_t classify_component(index_t component, index_t v)
Classifies a connected component.
void unlock()
Releases the lock associated with this mesh.
void set_detect_intersecting_neighbors(bool x)
detect and compute intersections between facets that share a facet or an edge. Set to false if input ...
void set_dry_run(bool x)
In dry run mode, the computed local triangulations are not inserted in the global mesh....
index_t find_or_create_exact_vertex(const ExactPoint &p)
Finds or creates a vertex in the mesh, by exact coordinates.
void set_fine_verbose(bool x)
Display detailed information while computing the intersection. Default is unset.
void set_normalize(bool x)
Specifies whether coordinates should be normalized during computation. If set, original coordinates a...
void intersect_prologue()
substep of intersect(), prepares the mesh
void remove_external_shell()
Removes all the facets that are on the outer boundary.
const Mesh & readonly_mesh() const
Gets a copy of the initial mesh passed to the constructor.
void set_build_skeleton(Mesh *skeleton, bool trim_fins=false)
Optionally save the skeleton (that is, the collection of non-manifold edges) to a given mesh....
const Mesh & target_mesh() const
Gets the target mesh.
ExactPoint exact_vertex(index_t v) const
Gets the exact point associated with a vertex.
void set_radial_sort(bool x)
Specifies whether surfaces should be duplicated and radial edges sorted in order to create the volume...
void intersect_epilogue(const vector< IsectInfo > &intersections)
subset of intersect(), cleans the resulting mesh and undoes optional geometric normalization.
void intersect_get_intersections(vector< IsectInfo > &intersections)
substep of intersect(), finds all the intersection points and segments.
void classify(const std::string &expr)
Classifies the facets and keep only the ones on the boundary of a combination of regions defined by a...
index_t tentatively_classify_component_vertex(index_t component, index_t v)
Classifies a vertex of the computed intersection.
void lock()
Acquires a lock on this mesh.
void intersect_remesh_intersections(vector< IsectInfo > &intersections)
substep of intersect(), inserts the intersection points and segments into the triangles.
void mark_external_shell(vector< index_t > &on_external_shell)
Marks all the facets that are on the external shell.
void build_Weiler_model()
Builds the Weiler model.
void set_interpolate_attributes(bool x)
Specifies that attributes should be interpolated.
Mesh & target_mesh()
Gets the target mesh.
void set_delaunay(bool x)
If set, compute constrained Delaunay triangulation in the intersected triangles. If there are interse...
Represents a mesh.
Definition mesh.h:3132
Wraps an integer to be used with the range-based for construct.
Definition range.h:66
Comparator class for vec3Hg \detail Used to create maps indexed by vec3Hg or SOS symbolic perturbatio...
Definition vechg.h:293
3d vector with homogeneous coordinates
Definition vechg.h:185
Vector with aligned memory allocation.
Definition memory.h:710
index_t size() const
Gets the number of elements.
Definition memory.h:756
Exact predicates and constructs.
Common include file, providing basic definitions. Should be included before anything else by all head...
The class that represents a mesh.
Functions to load and save meshes.
SOSMode
Mode for symbolic perturbations.
Definition predicates.h:67
std::atomic_flag spinlock
A lightweight synchronization structure.
Global Vorpaline namespace.
Definition basic.h:55
bool mesh_facets_have_intersection(Mesh &M, index_t f1, index_t f2)
Tests whether two mesh facets have a non-degenerate intersection.
void mesh_intersection(Mesh &result, const Mesh &A, const Mesh &B, MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT)
Computes the intersection of two surface meshes.
void mesh_difference(Mesh &result, const Mesh &A, const Mesh &B, MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT)
Computes the difference of two surface meshes.
void mesh_boolean_operation(Mesh &result, const Mesh &A, const Mesh &B, const std::string &operation, MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT)
Computes a boolean operation with two surface meshes.
void mesh_union(Mesh &result, const Mesh &A, const Mesh &B, MeshBooleanOperationFlags flags=MESH_BOOL_OPS_DEFAULT)
Computes the union of two surface meshes.
geo_index_t index_t
The type for storing and manipulating indices.
Definition numeric.h:329
Sign
Integer constants that represent the sign of a value.
Definition numeric.h:68
void mesh_remove_intersections(Mesh &M, index_t max_iter=3, bool verbose=false)
Attempts to make a surface mesh conformal by removing intersecting facets and re-triangulating the ho...
Function and classes for process manipulation.