Branch data Line data Source code
1 : : //- Class: SurfaceOverlapFacet
2 : : //- Description: Facet definition class for efficient processing
3 : : //- for SurfaceOverlapTool.
4 : : //- Owner: Steve Storm
5 : : //- Created: January 26, 2003
6 : :
7 : : #include "SurfaceOverlapFacet.hpp"
8 : : #include "GfxPreview.hpp"
9 : :
10 : 1635 : AnalyticGeometryTool* SurfaceOverlapFacet::agt = AnalyticGeometryTool::instance();
11 : :
12 : : // Constructor
13 : 0 : SurfaceOverlapFacet::SurfaceOverlapFacet( GPoint p[3] )
14 : : {
15 : 0 : t.b.x = p[0].x;
16 : 0 : t.b.y = p[0].y;
17 : 0 : t.b.z = p[0].z;
18 : :
19 : 0 : t.e0.x = p[1].x - p[0].x;
20 : 0 : t.e0.y = p[1].y - p[0].y;
21 : 0 : t.e0.z = p[1].z - p[0].z;
22 : :
23 : 0 : t.e1.x = p[2].x - p[0].x;
24 : 0 : t.e1.y = p[2].y - p[0].y;
25 : 0 : t.e1.z = p[2].z - p[0].z;
26 : :
27 [ # # ]: 0 : CubitVector min;
28 : :
29 [ # # ]: 0 : min.set( CUBIT_MIN_3( p[0].x, p[1].x, p[2].x ),
30 [ # # ]: 0 : CUBIT_MIN_3( p[0].y, p[1].y, p[2].y ),
31 [ # # ][ # # ]: 0 : CUBIT_MIN_3( p[0].z, p[1].z, p[2].z ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
32 : :
33 [ # # ]: 0 : CubitVector max;
34 : :
35 [ # # ]: 0 : max.set( CUBIT_MAX_3( p[0].x, p[1].x, p[2].x ),
36 [ # # ]: 0 : CUBIT_MAX_3( p[0].y, p[1].y, p[2].y ),
37 [ # # ][ # # ]: 0 : CUBIT_MAX_3( p[0].z, p[1].z, p[2].z ) );
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ][ # # ]
38 : :
39 [ # # ]: 0 : boundingBox.reset( min, max );
40 : 0 : }
41 : :
42 : : // Destructor
43 : 0 : SurfaceOverlapFacet::~SurfaceOverlapFacet()
44 : : {
45 : 0 : }
46 : :
47 : 0 : double SurfaceOverlapFacet::distance( SurfaceOverlapFacet &other_facet )
48 : : {
49 : : double s, t2, u, v;
50 [ # # ]: 0 : return agt->MinTriangleTriangle( t, other_facet.t, s, t2, u, v );
51 : : }
52 : :
53 : 0 : double SurfaceOverlapFacet::perimeter()
54 : : {
55 [ # # ]: 0 : CubitVector pt0( t.b.x, t.b.y, t.b.z );
56 : : CubitVector pt1( t.b.x + t.e0.x,
57 : : t.b.y + t.e0.y,
58 [ # # ]: 0 : t.b.z + t.e0.z );
59 : : CubitVector pt2( t.b.x + t.e1.x,
60 : : t.b.y + t.e1.y,
61 [ # # ]: 0 : t.b.z + t.e1.z );
62 : :
63 [ # # ]: 0 : double total_dist = pt0.distance_between(pt1);
64 [ # # ]: 0 : total_dist += pt1.distance_between( pt2 );
65 [ # # ]: 0 : total_dist += pt2.distance_between( pt0 );
66 : :
67 : 0 : return total_dist;
68 : : }
69 : :
70 : 0 : bool SurfaceOverlapFacet::facet_points_within_tol( SurfaceOverlapFacet *other_face, double tolerance )
71 : : {
72 [ # # ]: 0 : CubitVector tmp_pt( t.b.x, t.b.y, t.b.z );
73 [ # # ][ # # ]: 0 : if( this->distance_from_position( tmp_pt ) > tolerance )
74 : 0 : return false;
75 : :
76 : : tmp_pt.set( t.b.x + t.e0.x,
77 : : t.b.y + t.e0.y,
78 [ # # ]: 0 : t.b.z + t.e0.z );
79 : :
80 [ # # ][ # # ]: 0 : if( this->distance_from_position( tmp_pt ) > tolerance )
81 : 0 : return false;
82 : :
83 : : tmp_pt.set( t.b.x + t.e1.x,
84 : : t.b.y + t.e1.y,
85 [ # # ]: 0 : t.b.z + t.e1.z );
86 : :
87 [ # # ][ # # ]: 0 : if( this->distance_from_position( tmp_pt ) > tolerance )
88 : 0 : return false;
89 : :
90 : 0 : return true;
91 : : }
92 : :
93 : 0 : double SurfaceOverlapFacet::distance_from_position( CubitVector &position )
94 : : {
95 : : double s,t;
96 : : Point3 tmp_point;
97 [ # # ]: 0 : tmp_point.x = position.x();
98 [ # # ]: 0 : tmp_point.y = position.y();
99 [ # # ]: 0 : tmp_point.z = position.z();
100 [ # # ]: 0 : return agt->MinPointTriangle( tmp_point, this->t, s, t );
101 : : }
102 : :
103 : : CubitBoolean
104 : 0 : SurfaceOverlapFacet::facing( SurfaceOverlapFacet &other_facet )
105 : : {
106 : : double norm1[3];
107 [ # # ]: 0 : agt->Normal( t, norm1 );
108 : : double norm2[3];
109 [ # # ]: 0 : agt->Normal( other_facet.t, norm2 );
110 : :
111 : : // move to the origin
112 : : double o1[3];
113 : 0 : o1[0] = other_facet.t.b.x-t.b.x;
114 : 0 : o1[1] = other_facet.t.b.y-t.b.y;
115 : 0 : o1[2] = other_facet.t.b.z-t.b.z;
116 : :
117 [ # # ]: 0 : double dot_p = agt->dot_vec(norm1,o1);
118 : 0 : return (CubitBoolean)(dot_p >= 0.0);
119 : : }
120 : :
121 : : double
122 : 0 : SurfaceOverlapFacet::angle( SurfaceOverlapFacet &other_facet )
123 : : {
124 : 0 : return agt->Angle( t, other_facet.t ) * RADtoDEG;
125 : : }
126 : :
127 : : double
128 : 0 : SurfaceOverlapFacet::projected_overlap( SurfaceOverlapFacet &other_facet, CubitBoolean draw_overlap )
129 : : {
130 : 0 : double tmp_double = agt->ProjectedOverlap( t, other_facet.t, draw_overlap );
131 : :
132 [ # # ]: 0 : if( tmp_double > 0.00 )
133 : : {
134 [ # # ]: 0 : CubitVector edge0(t.e0.x, t.e0.y, t.e0.z);
135 [ # # ]: 0 : CubitVector edge1(t.e1.x, t.e1.y, t.e1.z);
136 [ # # ]: 0 : CubitVector normal = edge0 * edge1;
137 [ # # ]: 0 : double area_facet1 = normal.length() / 2;
138 : :
139 [ # # ]: 0 : edge0.set(other_facet.t.e0.x, other_facet.t.e0.y, other_facet.t.e0.z);
140 [ # # ]: 0 : edge1.set(other_facet.t.e1.x, other_facet.t.e1.y, other_facet.t.e1.z);
141 [ # # ][ # # ]: 0 : normal = edge0 * edge1;
142 [ # # ]: 0 : double area_facet2 = normal.length() / 2;
143 : :
144 : : //don't report overlapping area between facets unless it is greater
145 : : //than one hundredth of the area of the smaller facet
146 [ # # ]: 0 : if( area_facet1 < area_facet2 )
147 : : {
148 [ # # ]: 0 : if( tmp_double < (area_facet1*0.01))
149 : 0 : tmp_double = 0.0;
150 : : }
151 [ # # ]: 0 : else if( tmp_double < (area_facet2*0.01 ))
152 : 0 : tmp_double = 0.0;
153 : : }
154 : 0 : return tmp_double;
155 : : }
156 : :
157 : :
158 : 0 : void SurfaceOverlapFacet::draw( int color )
159 : : {
160 [ # # ]: 0 : CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );
161 : : CubitVector point2 = CubitVector( t.e0.x + t.b.x,
162 : : t.e0.y + t.b.y,
163 [ # # ]: 0 : t.e0.z + t.b.z );
164 : : CubitVector point3 = CubitVector( t.e1.x + t.b.x,
165 : : t.e1.y + t.b.y,
166 [ # # ]: 0 : t.e1.z + t.b.z );
167 : :
168 [ # # ]: 0 : GfxPreview::draw_line( point1, point2, color );
169 [ # # ]: 0 : GfxPreview::draw_line( point2, point3, color );
170 [ # # ]: 0 : GfxPreview::draw_line( point1, point3, color );
171 : :
172 : 0 : return;
173 : : }
174 : :
175 : 0 : CubitVector SurfaceOverlapFacet::centroid()
176 : : {
177 : :
178 [ # # ]: 0 : CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );
179 : : CubitVector point2 = CubitVector( t.e0.x + t.b.x,
180 : : t.e0.y + t.b.y,
181 [ # # ]: 0 : t.e0.z + t.b.z );
182 : : CubitVector point3 = CubitVector( t.e1.x + t.b.x,
183 : : t.e1.y + t.b.y,
184 [ # # ]: 0 : t.e1.z + t.b.z );
185 : :
186 [ # # ]: 0 : point1 += point2;
187 [ # # ]: 0 : point1 += point3;
188 [ # # ]: 0 : point1 /= 3;
189 : :
190 : 0 : return point1;
191 : : }
192 : :
193 : 0 : CubitVector SurfaceOverlapFacet::smallest_edge_midpoint()
194 : : {
195 [ # # ]: 0 : CubitVector point1 = CubitVector( t.b.x, t.b.y, t.b.z );
196 : : CubitVector point2 = CubitVector( t.e0.x + t.b.x,
197 : : t.e0.y + t.b.y,
198 [ # # ]: 0 : t.e0.z + t.b.z );
199 : : CubitVector point3 = CubitVector( t.e1.x + t.b.x,
200 : : t.e1.y + t.b.y,
201 [ # # ]: 0 : t.e1.z + t.b.z );
202 : :
203 [ # # ]: 0 : double len_12 = point1.distance_between( point2 );
204 [ # # ]: 0 : double len_23 = point2.distance_between( point3 );
205 [ # # ]: 0 : double len_13 = point1.distance_between( point3 );
206 : :
207 [ # # ][ # # ]: 0 : if( (len_12 < len_23) && (len_12 < len_13) )
208 : : {
209 [ # # ]: 0 : point1 += point2;
210 [ # # ]: 0 : point1 /= 2;
211 [ # # ]: 0 : return point1;
212 : : }
213 [ # # ]: 0 : else if( len_23 < len_13 )
214 : : {
215 [ # # ]: 0 : point2 += point3;
216 [ # # ]: 0 : point2 /= 2;
217 [ # # ]: 0 : return point2;
218 : : }
219 : : else
220 : : {
221 [ # # ]: 0 : point1 += point3;
222 [ # # ]: 0 : point1 /= 2;
223 [ # # ]: 0 : return point1;
224 : : }
225 [ + - ][ + - ]: 6540 : }
|