Branch data Line data Source code
1 : : //- Class: CurveOverlapFacet
2 : : //- Description: Facet definition class for efficient processing
3 : : //- for OverlapTool.
4 : : //- Owner: Corey Ernst
5 : : //- Created: August 11, 2005
6 : :
7 : : #include "CurveOverlapFacet.hpp"
8 : : #include "IntersectionTool.hpp"
9 : : #include "GfxPreview.hpp"
10 : :
11 : : //AnalyticGeometryTool* CurveOverlapFacet::agt = AnalyticGeometryTool::instance();
12 : :
13 : : // Constructor
14 : 0 : CurveOverlapFacet::CurveOverlapFacet( GPoint p[2] )
15 : : {
16 [ # # ]: 0 : p0.set( p[0].x, p[0].y, p[0].z);
17 [ # # ]: 0 : p1.set( p[1].x, p[1].y, p[1].z);
18 : :
19 [ # # ]: 0 : CubitVector min;
20 : 0 : min.set( CUBIT_MIN( p[0].x, p[1].x ),
21 : 0 : CUBIT_MIN( p[0].y, p[1].y ),
22 [ # # ][ # # ]: 0 : CUBIT_MIN( p[0].z, p[1].z ) );
[ # # ][ # # ]
23 : :
24 [ # # ]: 0 : CubitVector max;
25 : 0 : max.set( CUBIT_MAX( p[0].x, p[1].x ),
26 : 0 : CUBIT_MAX( p[0].y, p[1].y ),
27 [ # # ][ # # ]: 0 : CUBIT_MAX( p[0].z, p[1].z ) );
[ # # ][ # # ]
28 : :
29 [ # # ]: 0 : boundingBox.reset( min, max );
30 : :
31 : 0 : facetLength = 0.0;
32 : 0 : }
33 : :
34 : : // Destructor
35 : 0 : CurveOverlapFacet::~CurveOverlapFacet()
36 : : {
37 : 0 : }
38 : :
39 : 0 : double CurveOverlapFacet::distance_overlapping( CurveOverlapFacet *other_facet )
40 : : {
41 : : //determine which is the smaller facet
42 : : CurveOverlapFacet *short_facet, *long_facet;
43 [ # # ][ # # ]: 0 : if( this->length() < other_facet->length() )
[ # # ]
44 : : {
45 : 0 : short_facet = this;
46 : 0 : long_facet = other_facet;
47 : : }
48 : : else
49 : : {
50 : 0 : short_facet = other_facet;
51 : 0 : long_facet = this;
52 : : }
53 : :
54 [ # # ]: 0 : CubitVector long_facet_vector(long_facet->p1 - long_facet->p0);
55 [ # # ]: 0 : double long_facet_length = long_facet_vector.length();
56 [ # # ]: 0 : long_facet_vector.normalize();
57 : :
58 [ # # ]: 0 : CubitVector l_p0_to_s_p0( short_facet->p0 - long_facet->p0 );
59 [ # # ]: 0 : CubitVector l_p0_to_s_p1( short_facet->p1 - long_facet->p0 );
60 : :
61 [ # # ]: 0 : double dot_to_s_p0 = l_p0_to_s_p0 % long_facet_vector;
62 [ # # ]: 0 : double dot_to_s_p1 = l_p0_to_s_p1 % long_facet_vector;
63 : :
64 : : //no overlap
65 [ # # ][ # # ]: 0 : if( ( dot_to_s_p0 <= 0.0 && dot_to_s_p1 <= 0.0) ||
[ # # ]
66 [ # # ]: 0 : ( dot_to_s_p0 >= long_facet_length &&
67 : : dot_to_s_p1 >= long_facet_length ) )
68 : : {
69 : 0 : return 0.0;
70 : : }
71 : :
72 : : //overlap like this:
73 : : // o-----------o
74 : : // o---------------------o
75 [ # # ][ # # ]: 0 : if( dot_to_s_p0 > 0.0 && dot_to_s_p1 < 0.0 )
76 : 0 : return dot_to_s_p0;
77 [ # # ][ # # ]: 0 : if( dot_to_s_p1 > 0.0 && dot_to_s_p0 < 0.0 )
78 : 0 : return dot_to_s_p1;
79 [ # # ][ # # ]: 0 : if( dot_to_s_p0 > long_facet_length &&
80 : : dot_to_s_p1 < long_facet_length )
81 : 0 : return long_facet_length - dot_to_s_p1;
82 [ # # ][ # # ]: 0 : if( dot_to_s_p1 > long_facet_length &&
83 : : dot_to_s_p0 < long_facet_length )
84 : 0 : return long_facet_length - dot_to_s_p0;
85 : :
86 : :
87 : : //overlap like this
88 : : // o-----------o
89 : : // o---------------------o
90 : : // or this:
91 : : // o-----------o
92 : : // o---------------------o
93 : : // or this:
94 : : // o---------------------o
95 : : // o---------------------o
96 [ # # ][ # # ]: 0 : if( (dot_to_s_p0 <= long_facet_length &&
97 [ # # ]: 0 : dot_to_s_p1 < long_facet_length ) ||
98 [ # # ]: 0 : (dot_to_s_p1 <= long_facet_length &&
99 : : dot_to_s_p0 < long_facet_length ) )
100 : 0 : return fabs( dot_to_s_p0 - dot_to_s_p1 );
101 : :
102 : 0 : return 0.0;
103 : :
104 : : /*
105 : : //create vectors
106 : : CubitVector v0( long_facet->p1 - long_facet->p0 );
107 : : CubitVector v1( short_facet->p0 - long_facet->p0 );
108 : : CubitVector v2( short_facet->p1 - long_facet->p0 );
109 : : CubitVector normalized_v0 = v0;
110 : : normalized_v0.normalize();
111 : :
112 : : //project v1 and v2 onto v0
113 : : double dot1 = normalized_v0 % v1;
114 : : double dot2 = normalized_v0 % v2;
115 : : v1 = normalized_v0 * dot1;
116 : : v2 = normalized_v0 * dot2;
117 : : double length0 = v0.length();
118 : : double length1 = v1.length();
119 : : double length2 = v2.length();
120 : :
121 : : //no overlap at all
122 : : if( (length1 > long_facet->length() && length2 > long_facet->length() ) ||
123 : : (dot1 <= 0 && dot2 <= 0 ) )
124 : : {
125 : : return 0.0;
126 : : }
127 : : else if( dot1 <= 0 && dot2 > 0 )
128 : : {
129 : : return length2;
130 : : }
131 : : else if( length2 <= 0 && length1 > 0 )
132 : : {
133 : : return length1;
134 : : }
135 : : else if( length1 > length0 )
136 : : {
137 : : return length0 - length2;
138 : : }
139 : : else if( length2 > length0 )
140 : : {
141 : : return length0 - length1;
142 : : }
143 : : //else
144 : : return fabs( length2 - length1 );
145 : : */
146 : : /*
147 : : CubitVector tmp_vec1( p0.x, p0.y, p0.z);
148 : : CubitVector tmp_vec2( p1.x, p1.y, p1.z);
149 : :
150 : : CubitVector tmp_vec3( other_facet->p0.x, other_facet->p0.y, other_facet->p0.z);
151 : : CubitVector tmp_vec4( other_facet->p1.x, other_facet->p1.y, other_facet->p1.z);
152 : :
153 : :
154 : : IntersectionTool int_tool( GEOMETRY_RESABS );
155 : :
156 : : CubitVector closest_point_seg_1;
157 : : CubitVector closest_point_seg_2;
158 : : double sc, tc;
159 : : CubitStatus stat = int_tool.closest_points_on_segments( p0, p1,
160 : : other_facet->p0, other_facet->p1,
161 : : closest_point_seg_1, closest_point_seg_2,
162 : : sc, tc );
163 : : //Make sure the closest points aren't the end points. If they are
164 : : //and we are within tolerance, it may be that the tolerance is too big
165 : : //cause we shouldn't be at a cross if the closest point is an end point...
166 : : if ( sc > 0. && sc < 1. && tc > 0. && tc < 1. &&
167 : : closest_point_seg_1.within_tolerance(closest_point_seg_2, 0.001) )
168 : : {
169 : :
170 : :
171 : :
172 : : }
173 : : return 0.0;
174 : : */
175 : : }
176 : :
177 : 0 : double CurveOverlapFacet::angle( CurveOverlapFacet *other_facet )
178 : : {
179 [ # # ]: 0 : CubitVector vec1 = p1 - p0;
180 [ # # ]: 0 : CubitVector vec2 = other_facet->p1 - other_facet->p0;
181 : :
182 [ # # ]: 0 : double angle = vec1.interior_angle( vec2 );
183 : 0 : return angle;
184 : : }
185 : :
186 : 0 : double CurveOverlapFacet::length()
187 : : {
188 [ # # ]: 0 : if( facetLength == 0.0 )
189 : : {
190 [ # # ]: 0 : CubitVector tmp_vec = p1 - p0;
191 [ # # ]: 0 : facetLength = tmp_vec.length();
192 : : }
193 : 0 : return facetLength;
194 : : }
195 : :
196 : 0 : double CurveOverlapFacet::facet_to_facet_distance( CurveOverlapFacet *other_facet )
197 : : {
198 [ # # ]: 0 : CubitVector u = p1 - p0;
199 [ # # ]: 0 : CubitVector v = other_facet->p1 - other_facet->p0;
200 [ # # ]: 0 : CubitVector w = p0 - other_facet->p0;
201 [ # # ]: 0 : double a = u%u;
202 [ # # ]: 0 : double b = u%v;
203 [ # # ]: 0 : double c = v%v;
204 [ # # ]: 0 : double d = u%w;
205 [ # # ]: 0 : double e = v%w;
206 : 0 : double D = a*c - b*b;
207 : 0 : double sc, sN, sD = D;
208 : 0 : double tc, tN, tD = D;
209 : :
210 : : // compute the line parameters of the two closest points
211 [ # # ]: 0 : if( D < GEOMETRY_RESABS ) ///the lines are almost parallel
212 : : {
213 : 0 : sN = 0.0; // force using point P0 on segment S1
214 : 0 : sD = 1.0; // to prevent possible division by 0.0 later
215 : 0 : tN = e;
216 : 0 : tD = c;
217 : : }
218 : : else // get the closest points on the infinite lines
219 : : {
220 : 0 : sN = (b*e - c*d);
221 : 0 : tN = (a*e - b*d);
222 [ # # ]: 0 : if (sN < 0.0)
223 : : { // sc < 0 => the s=0 edge is visible
224 : 0 : sN = 0.0;
225 : 0 : tN = e;
226 : 0 : tD = c;
227 : : }
228 [ # # ]: 0 : else if (sN > sD)
229 : : { // sc > 1 => the s=1 edge is visible
230 : 0 : sN = sD;
231 : 0 : tN = e + b;
232 : 0 : tD = c;
233 : : }
234 : : }
235 : :
236 [ # # ]: 0 : if (tN < 0.0)
237 : : { // tc < 0 => the t=0 edge is visible
238 : 0 : tN = 0.0;
239 : : // recompute sc for this edge
240 [ # # ]: 0 : if (-d < 0.0)
241 : 0 : sN = 0.0;
242 [ # # ]: 0 : else if (-d > a)
243 : 0 : sN = sD;
244 : : else
245 : : {
246 : 0 : sN = -d;
247 : 0 : sD = a;
248 : : }
249 : : }
250 [ # # ]: 0 : else if (tN > tD)
251 : : { // tc > 1 => the t=1 edge is visible
252 : 0 : tN = tD;
253 : : // recompute sc for this edge
254 [ # # ]: 0 : if ((-d + b) < 0.0)
255 : 0 : sN = 0;
256 [ # # ]: 0 : else if ((-d + b) > a)
257 : 0 : sN = sD;
258 : : else
259 : : {
260 : 0 : sN = (-d + b);
261 : 0 : sD = a;
262 : : }
263 : : }
264 : :
265 : : // finally do the division to get sc and tc
266 [ # # ]: 0 : sc = (fabs(sN) < GEOMETRY_RESABS ? 0.0 : sN / sD);
267 [ # # ]: 0 : tc = (fabs(tN) < GEOMETRY_RESABS ? 0.0 : tN / tD);
268 : :
269 : : // get the difference of the two closest points
270 [ # # ][ # # ]: 0 : CubitVector dP = w + (sc * u) - (tc * v); // = S1(sc) - S2(tc)
[ # # ][ # # ]
271 : :
272 [ # # ]: 0 : return dP.length(); // return the closest distance
273 : : }
274 : :
275 : 0 : void CurveOverlapFacet::draw( int color )
276 : : {
277 : 0 : GfxPreview::draw_line( p0, p1, color );
278 : 0 : return;
279 : : }
280 : :
281 : 0 : CubitVector CurveOverlapFacet::start_point()
282 : : {
283 : 0 : return p0;
284 : : }
285 : :
286 : 0 : CubitVector CurveOverlapFacet::end_point()
287 : : {
288 : 0 : return p1;
289 [ + - ][ + - ]: 6540 : }
290 : :
|