SheafSystem  0.0.0.0
db0_point_locator.cc
Go to the documentation of this file.
1 
2 //
3 // Copyright (c) 2014 Limit Point Systems, Inc.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 
20 
21 #include "SheafSystem/db0_point_locator.impl.h"
22 
23 #include "SheafSystem/block.impl.h"
24 #include "SheafSystem/section_space_schema_poset.h"
25 
26 using namespace std;
27 using namespace geometry; // Workaround for MS C++ bug.
28 
29 // ============================================================================
31 // ============================================================================
33 
34 template<>
35 int
37 bin_id(const bin_coord_type xcoord[]) const
38 {
39  return (xcoord[0]);
40 };
41 
42 template<>
43 int
45 bin_id(const bin_coord_type xcoord[]) const
46 {
47  return (xcoord[0]*_bin_ub[1] + xcoord[1]);
48 };
49 
50 template<>
51 int
53 bin_id(const bin_coord_type xcoord[]) const
54 {
55  return (xcoord[0]*_bin_ub[1] + xcoord[1])*_bin_ub[2] + xcoord[2];
56 };
57 
58 template<>
59 void
61 print_bins(std::ostream& xos, const std::string& xmsg) const
62 {
63  // Preconditions:
64 
65 
66  // Body:
67 
68  xos << endl << xmsg << endl;
69 
70  xos << "_bins.ub()= " << _bins.ub()
71  << " _bins.ct()= " << _bins.ct()
72  << endl;
73 
74  int l = 0;
75  for(int i=0; i<_bin_ub[0]; ++i)
76  {
77  for(int j=0; j<_bin_ub[1]; ++j)
78  {
79  for(int k=0; k<_bin_ub[2]; ++k)
80  {
81  cout << "bin: " << setw(3) << l++;
82 
83  cout << setw(3) << i;
84  cout << setw(3) << j;
85  cout << setw(3) << k;
86 
87  cout << setw(16) << i*_bin_size[0] + _lb[0];
88  cout << setw(16) << j*_bin_size[1] + _lb[1];
89  cout << setw(16) << k*_bin_size[2] + _lb[2];
90  cout << endl;
91 
92  cout << " vertices: " << endl;
93 
94  const vertex_list_type& lverts = _bins[i];
95 
96  for(vertex_list_type::const_iterator lv_itr = lverts.begin();
97  lv_itr != lverts.end();
98  ++lv_itr)
99  {
100  cout << setw(6) << lv_itr->disc_id
101  << setw(6) << lv_itr->branch_id
102  << setw(16) << lv_itr->coords[0]
103  << setw(16) << lv_itr->coords[1]
104  << setw(16) << lv_itr->coords[2]
105  << endl;
106 
107  }
108  cout << endl;
109  }
110  }
111  }
112 
113  // Postconditions:
114 
115 
116  // Exit:
117 
118  return;
119 }
120 
121 template<>
125  const bin_coord_type xbin_pos[]) const
126 {
127  sec_vd_value_type result;
128 
129  // Preconditions:
130 
131 
132  // Body:
133 
134  // vertex 0: i
135 
136  sec_vd_value_type x = xbin_pos[0]*_bin_size[0] + _lb[0];
137  sec_vd_value_type delx = xpt[0] - x;
138  sec_vd_value_type dist = abs(delx);
139  result = dist;
140 
141  // vertex 1: i+1
142 
143  x +=_bin_size[0];
144  delx = xpt[0] - x;
145  dist = abs(delx);
146 
147  result = dist > result ? dist : result;
148 
149  // Postconditions:
150 
151  ensure(result >= 0.0);
152 
153  // Exit:
154 
155  return result;
156 }
157 
158 
159 template<>
163  const bin_coord_type xbin_pos[]) const
164 {
165  sec_vd_value_type result;
166 
167  // Preconditions:
168 
169 
170  // Body:
171 
172  sec_vd_value_type del[2][2];
173  for(int i=0; i< 2; ++i)
174  {
175  sec_vd_value_type x = xbin_pos[i]*_bin_size[i] + _lb[i];
176  sec_vd_value_type deli0 = xpt[0] - x;
177  del[i][0] = deli0*deli0;
178 
179  sec_vd_value_type deli1 = deli0 - _bin_size[i];
180  del[i][1] = deli1*deli1;
181  }
182 
184 
185  for(int i=0; i<2; ++i)
186  {
187  for(int j=0; j<2; ++j)
188  {
189  sec_vd_value_type dist = del[0][i] + del[1][j];
190  if(dist > result)
191  result = dist;
192  }
193  }
194 
195  result = sqrt(result);
196 
197  // Postconditions:
198 
199  ensure(result >= 0.0);
200 
201  // Exit:
202 
203  return result;
204 }
205 
206 
207 template<>
211  const bin_coord_type xbin_pos[]) const
212 {
213  sec_vd_value_type result;
214 
215  // Preconditions:
216 
217 
218  // Body:
219 
220 #ifdef DIAGNOSTIC_OUTPUT
221 
222  cout << "bin: "
223  << setw(3) << xbin_pos[0]
224  << setw(3) << xbin_pos[1]
225  << setw(3) << xbin_pos[2]
226  << endl;
227 #endif
228 
229  sec_vd_value_type del[3][2];
230  for(int i=0; i< 3; ++i)
231  {
232  sec_vd_value_type x = xbin_pos[i]*_bin_size[i] + _lb[i];
233  sec_vd_value_type deli0 = xpt[i] - x;
234  del[i][0] = deli0*deli0;
235 
236  sec_vd_value_type deli1 = deli0 - _bin_size[i];
237  del[i][1] = deli1*deli1;
238 
239 #ifdef DIAGNOSTIC_OUTPUT
240 
241  cout << "c: " << i
242  << " del[c][0]: " << del[i][0]
243  << " del[c][1]: " << del[i][1] << endl;
244 #endif
245 
246  }
247 
249 
250  for(int i=0; i<2; ++i)
251  {
252  for(int j=0; j<2; ++j)
253  {
254  for(int k=0; k<2; ++k)
255  {
256  sec_vd_value_type dist = del[0][i] + del[1][j] + del[2][k];
257  if(dist > result)
258  result = dist;
259 
260 #ifdef DIAGNOSTIC_OUTPUT
261 
262  cout << "corner: " << setw(2) << i << setw(2) << j << setw(2) << k
263  << " dist:" << setw(16) << dist
264  << " result:" << setw(16) << result
265  << endl;
266 #endif
267 
268  }
269  }
270  }
271 
272  result = sqrt(result);
273 
274  // Postconditions:
275 
276  ensure(result >= 0.0);
277 
278  // Exit:
279 
280  return result;
281 }
282 
284 
285 template<>
286 void
289 {
290  // Preconditions:
291 
292 
293  // Body:
294 
295  // Iterate over the bins in the search region.
296 
297  for(int i=_search_region_lb[0]; i<_search_region_ub[0]; ++i)
298  {
299  _search_q.push(i);
300  }
301 
302 #ifdef DIAGNOSTIC_OUTPUT
303  print_queue(cout, "search_q: ");
304 #endif
305 
306  // Postconditions:
307 
308  // Exit:
309 
310  return ;
311 }
312 
313 template<>
314 void
317 {
318  // Preconditions:
319 
320 
321  // Body:
322 
323  bin_coord_type lbin_coord[2];
324  bin_coord_type& i = lbin_coord[0];
325  bin_coord_type& j = lbin_coord[1];
326 
327 
328  // Iterate over the bins in the search region.
329 
330  for(i=_search_region_lb[0]; i<_search_region_ub[0]; ++i)
331  {
332  for(j=_search_region_lb[1]; j<_search_region_ub[1]; ++j)
333  {
334  _search_q.push(bin_id(lbin_coord));
335  }
336  }
337 
338 #ifdef DIAGNOSTIC_OUTPUT
339  print_queue(cout, "search_q: ");
340 #endif
341 
342  // Postconditions:
343 
344  // Exit:
345 
346  return ;
347 }
348 
349 template<>
350 void
353 {
354  // Preconditions:
355 
356 
357  // Body:
358 
359  bin_coord_type lbin_coord[3];
360  bin_coord_type& i = lbin_coord[0];
361  bin_coord_type& j = lbin_coord[1];
362  bin_coord_type& k = lbin_coord[2];
363 
364  // Iterate over the bins in the search region.
365 
366  for(i=_search_region_lb[0]; i<_search_region_ub[0]; ++i)
367  {
368  for(j=_search_region_lb[1]; j<_search_region_ub[1]; ++j)
369  {
370  for(k=_search_region_lb[2]; k<_search_region_ub[2]; ++k)
371  {
372  _search_q.push(bin_id(lbin_coord));
373  }
374  }
375  }
376 
377 #ifdef DIAGNOSTIC_OUTPUT
378  print_queue(cout, "search_q: ");
379 #endif
380 
381  // Postconditions:
382 
383  // Exit:
384 
385  return ;
386 }
387 
388 template<>
389 void
391 update_search_q(bin_coord_type xold_lb[], bin_coord_type xold_ub[])
392 {
393  // Preconditions:
394 
395  for(int i=_search_region_lb[0]; i<_search_region_ub[0];)
396  {
397  bool new_i = (i < xold_lb[0]) || (i >= xold_ub[0]);
398  if(new_i)
399  {
400  // This is a new i; put the bin in the q.
401 
402  _search_q.push(bin_id(&i));
403  i = i + 1;
404  }
405  else
406  {
407  // Skip to the end of the old i range.
408 
409  i = xold_ub[0];
410  }
411  }
412 
413 #ifdef DIAGNOSTIC_OUTPUT
414  print_queue(cout, "search_q: ");
415 #endif
416 
417  // Postconditions:
418 
419  // Exit:
420 
421  return;
422 }
423 
424 
425 template<>
426 void
428 update_search_q(bin_coord_type xold_lb[], bin_coord_type xold_ub[])
429 {
430  // Preconditions:
431 
432  bin_coord_type lbin_coord[2];
433  bin_coord_type& i = lbin_coord[0];
434  bin_coord_type& j = lbin_coord[1];
435 
436  for(j=_search_region_lb[1]; j<_search_region_ub[1]; ++j)
437  {
438  bool new_j = (j < xold_lb[1]) || (j >= xold_ub[1]);
439  for(i=_search_region_lb[0]; i<_search_region_ub[0];)
440  {
441  bool new_i = (i < xold_lb[0]) || (i >= xold_ub[0]);
442  if(new_j || new_i)
443  {
444  _search_q.push(bin_id(lbin_coord));
445  i = i+1;
446  }
447  else
448  {
449  i = xold_ub[0];
450  }
451  }
452  }
453 
454 #ifdef DIAGNOSTIC_OUTPUT
455  print_queue(cout, "search_q: ");
456 #endif
457 
458  // Postconditions:
459 
460  // Exit:
461 
462  return;
463 }
464 
465 template<>
466 void
468 update_search_q(bin_coord_type xold_lb[], bin_coord_type xold_ub[])
469 {
470  // Preconditions:
471 
472  bin_coord_type lbin_coord[3];
473  bin_coord_type& i = lbin_coord[0];
474  bin_coord_type& j = lbin_coord[1];
475  bin_coord_type& k = lbin_coord[2];
476 
477  for(k=_search_region_lb[2]; k<_search_region_ub[2]; ++k)
478  {
479  bool new_k = (k < xold_lb[2]) || (k >= xold_ub[2]);
480  for(j=_search_region_lb[1]; j<_search_region_ub[1]; ++j)
481  {
482  bool new_j = (j < xold_lb[1]) || (j >= xold_ub[1]);
483  for(i=_search_region_lb[0]; i<_search_region_ub[0];)
484  {
485  bool new_i = (i < xold_lb[0]) || (i >= xold_ub[0]);
486  if(new_k || new_j || new_i)
487  {
488  _search_q.push(bin_id(lbin_coord));
489  i = i+1;
490  }
491  else
492  {
493  i = xold_ub[0];
494  }
495  }
496  }
497  }
498 
499 #ifdef DIAGNOSTIC_OUTPUT
500  print_queue(cout, "search_q: ");
501 #endif
502 
503  // Postconditions:
504 
505  // Exit:
506 
507  return;
508 }
509 
510 
512 
513 
SHEAF_DLL_SPEC void sqrt(const sec_at0 &x0, sec_at0 &xresult, bool xauto_access)
Compute sqrt of x0 (sqrt(x0)) (pre-allocated version).
Definition: sec_at0.cc:1556
An abstract point location query in domains with global coordinate dimension DC and local coordinate ...
STL namespace.
int bin_coord_type
The type of the bin coordinates.
SHEAF_DLL_SPEC void max(const vd &x0, vd_value_type &xresult, bool xauto_access)
Maximum component of x0, pre-allocated version.
Definition: vd.cc:2097
void print_bins(std::ostream &xos, const std::string &xmsg) const
Prints the contents of the bins on xos; intended for debugging.
sec_vd_value_type max_bin_distance(const sec_vd_value_type xpt[], const bin_coord_type xbin_pos[]) const
The maximum distance from the query point xpt to any point in the bin with coordinates xbin_pos...
Namespace for geometry component of sheaf system.
Definition: field_vd.h:54
vd_value_type sec_vd_value_type
The type of component in the value of a section at a point.
Definition: fiber_bundle.h:73
int bin_id(const bin_coord_type xcoord[]) const
The id of the bin with bin coords xcoord.