Branch data Line data Source code
1 : : /*
2 : : *
3 : : *
4 : : * Copyright (C) 2004 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000
5 : : * with Sandia Corporation, the U.S. Government retains certain rights in this software.
6 : : *
7 : : * This file is part of facetbool--contact via [email protected]
8 : : *
9 : : * This library is free software; you can redistribute it and/or
10 : : * modify it under the terms of the GNU Lesser General Public
11 : : * License as published by the Free Software Foundation; either
12 : : * version 2.1 of the License, or (at your option) any later version.
13 : : *
14 : : * This library is distributed in the hope that it will be useful,
15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 : : * Lesser General Public License for more details.
18 : : *
19 : : * You should have received a copy of the GNU Lesser General Public
20 : : * License along with this library; if not, write to the Free Software
21 : : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 : : *
23 : : *
24 : : *
25 : : */
26 : :
27 : : #ifndef _FACETEDBOOLEANINTERSECT
28 : : #define _FACETEDBOOLEANINTERSECT
29 : : #include <math.h>
30 : : #include <vector>
31 : : #include "FBDefines.hpp"
32 : : #include "FBStructs.hpp"
33 : : #include "CubitDefines.h"
34 : : #include "FBClassify.hpp"
35 : :
36 : : class FBPolyhedron;
37 : : class FBRetriangulate;
38 : :
39 : : class FBIntersect {
40 : :
41 : : public:
42 : : FBIntersect();
43 : :
44 : : CubitStatus intersect(const std::vector<double>& Ticoords,
45 : : const std::vector<int>& Ticonnections,
46 : : const std::vector<double>& Tjcoords,
47 : : const std::vector<int>& Tjconnections,
48 : : std::vector<int>& duddedTiFacets,
49 : : std::vector<int>& duddedTjFacets,
50 : : std::vector<int>& newTiFacets,
51 : : std::vector<int>& newTjFacets,
52 : : std::vector<int>& newTiFacetsIndex,
53 : : std::vector<int>& newTjFacetsIndex,
54 : : std::vector<double>& newTiPoints,
55 : : std::vector<double>& newTjPoints,
56 : : std::vector<int>& edgesTi,
57 : : std::vector<int>& edgesTj
58 : : );
59 : :
60 : :
61 : : CubitStatus intersect(const std::vector<double>& Ticoords,
62 : : const std::vector<int>& Ticonnections,
63 : : const std::vector<double>& Tjcoords,
64 : : const std::vector<int>& Tjconnections,
65 : : std::vector<int>& newTiFacets,
66 : : std::vector<int>& newTjFacets,
67 : : std::vector<int> *indices1,
68 : : std::vector<int> *indices2
69 : : );
70 : :
71 : : ~FBIntersect();
72 : : void set_classify_flag(bool value);
73 : : CubitStatus gather_by_boolean(std::vector<double>& out_coords,
74 : : std::vector<int>& out_connections,
75 : : std::vector<int> *out_surf_index,
76 : : std::vector<int> *out_curve_index,
77 : : std::vector<bool> *is_body_1,
78 : : const CubitFacetboolOp op
79 : : );
80 : :
81 : : CubitStatus update_surfs_and_curves(std::vector<double>& out_coords,
82 : : std::vector<int>& out_connections,
83 : : std::vector<int> *out_surf_index,
84 : : std::vector<int> *out_curve_index,
85 : : const int whichone
86 : : );
87 : :
88 : : CubitStatus get_persistent_entity_info(bool *surfs_in,
89 : : bool *curves_in,
90 : : bool *surfs_out,
91 : : bool *curves_out,
92 : : const CubitFacetboolOp op,
93 : : const int whichparent
94 : : );
95 : :
96 : :
97 : : void set_body1_planar();
98 : : void set_body2_planar();
99 : : void set_imprint();
100 : :
101 : : private:
102 : : double linecoeff[3];
103 : : double linept[3];
104 : : FBPolyhedron *poly1, *poly2;
105 : : bool do_edges_only;
106 : : bool do_classify;
107 : : bool do_imprint;
108 : : bool body1_is_plane, body2_is_plane;
109 : : bool nothing_intersected;
110 : : std::vector<int> *f_c_indices1, *f_c_indices2;
111 : : FBClassify *classify1, *classify2;
112 : : CubitStatus pair_intersect();
113 : : int get_vertex(FBPolyhedron *poly, int vtx,
114 : : IntegerHash *hashobj,
115 : : std::vector<double>& out_coords,
116 : : int &num_sofar);
117 : : int makeahashvaluefrom_coord(double x, double y, double z);
118 : : CubitStatus tri_tri_intersect(FB_Triangle *tri1,
119 : : FB_Triangle *tri2);
120 : : CubitStatus add_intersection_edges(FB_Triangle *tri1,
121 : : FB_Triangle *tri2,
122 : : double *tt,
123 : : int *edge_vert_type);
124 : : inline void get_point_from_parameter(double parameter,
125 : : double *x, double *y, double *z);
126 : : inline double get_distance_parameter(double *xc0,
127 : : double *xc1,
128 : : double d0, double d1);
129 : : inline double get_distance_parameter_single(double *xc);
130 : : int get_intersectionline_parameter_values(
131 : : double d0,
132 : : double d1,
133 : : double d2,
134 : : double *pt0,
135 : : double *pt1,
136 : : double *pt2,
137 : : double& t0,
138 : : double& t1,
139 : : int& vert_type_0,
140 : : int& vert_type_1);
141 : 0 : inline int determine_edge_vert_type(int vtype1, int vtype2)
142 : : {
143 [ # # ][ # # ]: 0 : if ( ( (vtype1 == VERTEX_0) && (vtype2 == VERTEX_1) ) ||
[ # # ]
144 [ # # ]: 0 : ( (vtype1 == VERTEX_1) && (vtype2 == VERTEX_0) ) )
145 : 0 : return EDGE_0;
146 [ # # ][ # # ]: 0 : else if ( ( (vtype1 == VERTEX_1) && (vtype2 == VERTEX_2) ) ||
[ # # ]
147 [ # # ]: 0 : ( (vtype1 == VERTEX_2) && (vtype2 == VERTEX_1) ) )
148 : 0 : return EDGE_1;
149 [ # # ][ # # ]: 0 : else if ( ( (vtype1 == VERTEX_2) && (vtype2 == VERTEX_0) ) ||
[ # # ]
150 [ # # ]: 0 : ( (vtype1 == VERTEX_0) && (vtype2 == VERTEX_2) ) )
151 : 0 : return EDGE_2;
152 : 0 : else return INTERIOR_VERT;
153 : : }
154 : : void newplanecoefficients(FBPolyhedron *poly, FB_Triangle *tri);
155 : :
156 : : CubitStatus store_connectivity( std::vector<int>& out_connections,
157 : : int vertnum1,
158 : : int vertnum2,
159 : : int vertnum3 );
160 : : };
161 : :
162 : : #endif
|