117 {
119
125 };
126
127
128
129 Paths path_slave(1), path_master(1), solution;
130
131
132
133
134
135 double roundfact = 1e6;
136
137
138 Range tris_in_polygon;
139
141 v_slave_tri_cent.resize(3, false);
142
144 v_coords_slave_new.resize(9, false);
145
147 m_rot.resize(3, 3, false);
148
150 n_vec.resize(3, false);
151
153 v_coords_slave.resize(9, false);
154
155
156 int slave_num = 0;
157 for (Range::iterator tri_it_slave = range_surf_slave.begin();
158 tri_it_slave != range_surf_slave.end(); ++tri_it_slave) {
159 ++slave_num;
160
161 int num_nodes_slave;
164 num_nodes_slave);
165
166
167
168
171
172 for (int ii = 0; ii != 3; ++ii) {
173 prism_nodes[ii + 3] = conn_slave[ii];
174 }
175
177 &*v_coords_slave.data().begin());
178
179 auto t_coords_slave = get_tensor_vec(v_coords_slave);
180
181
182
185 &m_rot(0, 0), &m_rot(0, 1), &m_rot(0, 2), &m_rot(1, 0), &m_rot(1, 1),
186 &m_rot(1, 2), &m_rot(2, 0), &m_rot(2, 1), &m_rot(2, 2)};
187
189 auto t_slave_normal = get_tensor_vec(n_vec);
190
191
192 double z_shift;
193
194 auto t_coords_slave_new = get_tensor_vec(v_coords_slave_new);
195
196 auto t_slave_tri_cent = get_tensor_vec(v_slave_tri_cent);
197 t_slave_tri_cent(
i) = 0;
198
199
200 for (int ii = 0; ii != 3; ++ii) {
201 t_coords_slave_new(
i) = t_m_rot(
i,
j) * t_coords_slave(
j);
202 t_slave_tri_cent(
i) += t_coords_slave(
i) / 3;
203 if (ii == 0)
204 z_shift = v_coords_slave_new[2];
205
206 t_coords_slave_new(2) = 0;
207 ++t_coords_slave_new;
208 ++t_coords_slave;
209 }
210
211
212 v_coords_slave_new = roundfact * v_coords_slave_new;
213
214
215 path_slave[0].clear();
216 path_slave[0] << IntPoint(v_coords_slave_new[0], v_coords_slave_new[1])
217 << IntPoint(v_coords_slave_new[3], v_coords_slave_new[4])
218 << IntPoint(v_coords_slave_new[6], v_coords_slave_new[7]);
219
220
221
222
223
224
225 Range range_closest_master_tris;
226 range_closest_master_tris.clear();
227 double closest_point[3];
230 &*v_slave_tri_cent.data().begin(),
231 closest_point, closest_master_tri);
232
233 range_closest_master_tris.insert(closest_master_tri);
234
235
236
237 bool flag_first_master =
238 true;
239 int master_num = 0;
240 bool flag_end_of_search = false;
241 bool flag_temp = true;
242 while (flag_end_of_search == false) {
243
244 Range range_master_tris_on_surf_new;
245 if (flag_first_master == true) {
246 range_master_tris_on_surf_new = range_closest_master_tris;
247 flag_first_master = false;
248 } else {
249 flag_temp = false;
252 range_conn);
253
254 Range range_adj_entities;
255
256
257
258
259
261 range_conn, 2, false, range_adj_entities, moab::Interface::UNION);
262
263
264 Range range_master_tris_on_surf =
265 intersect(range_surf_master, range_adj_entities);
266
267
268
269 range_master_tris_on_surf_new =
270 subtract(range_master_tris_on_surf, range_closest_master_tris);
271 }
272
273
275 v_coords_master.resize(9, false);
276
278 n_vec_master.resize(3, false);
279
280
282 v_coords_master_new.resize(9, false);
283
284 double coord[3];
285
286
287
288 int num_intersections = 0;
289 for (Range::iterator tri_it_master =
290 range_master_tris_on_surf_new.begin();
291 tri_it_master != range_master_tris_on_surf_new.end();
292 ++tri_it_master) {
294 int num_nodes_master = 0;
296 num_nodes_master);
297
299 &*v_coords_master.data().begin());
300
301 auto t_coords_master = get_tensor_vec(v_coords_master);
302
304
305 auto t_master_normal = get_tensor_vec(n_vec_master);
306
307
308 if (fabs(t_slave_normal(
i) * t_master_normal(
i)) < 0.035)
309 continue;
310
311 auto t_coords_master_new = get_tensor_vec(v_coords_master_new);
312
313
314
315 for (int ii = 0; ii != 3; ++ii) {
316 t_coords_master_new(
i) = t_m_rot(
i,
j) * t_coords_master(
j);
317 t_coords_master_new(2) = 0;
318 ++t_coords_master_new;
319 ++t_coords_master;
320 }
321
322 v_coords_master_new = roundfact * v_coords_master_new;
323 path_master[0].clear();
324 path_master[0]
325 << IntPoint(v_coords_master_new[0], v_coords_master_new[1])
326 << IntPoint(v_coords_master_new[3], v_coords_master_new[4])
327 << IntPoint(v_coords_master_new[6], v_coords_master_new[7]);
328
329
331 c.AddPaths(path_master, ptSubject,
true);
332 c.AddPaths(path_slave, ptClip,
true);
333 c.Execute(ctIntersection, solution, pftNonZero, pftNonZero);
334
335 if (solution.size() != 1 && flag_temp) {
336 double ray_dir[3];
337 CHKERR Tools::getTriNormal(&v_coords_slave(0), ray_dir);
338 double norm = cblas_dnrm2(3, ray_dir, 1);
339 cblas_dscal(3, 1. / norm, ray_dir, 1);
340 const double tol = 1e-6;
341 std::vector<double> distance;
342 std::vector<EntityHandle> triangles_out;
344 &*v_slave_tri_cent.data().begin(),
345 triangles_out, distance);
346
347 if (!triangles_out.empty()) {
348 range_closest_master_tris.clear();
349 range_closest_master_tris.insert(triangles_out.front());
350 flag_first_master = true;
351 num_intersections = -1;
352 break;
353 }
354 }
355
356 if (solution.size() == 1) {
357 range_closest_master_tris.insert(
358 *tri_it_master);
359 num_intersections += 1;
360
361 int n_vertices_polygon = solution[0].size();
362
363
364
365 for (int ii = 0; ii != 3; ++ii) {
366 prism_nodes[ii] = conn_master[ii];
367 }
368
369
371 slave_master_1prism);
372
373 range_slave_master_prisms.insert(slave_master_1prism);
374
375
376
377
379 v_coord_polygon.resize(3 * n_vertices_polygon);
380
381
382
383
385 v_coord_polygon_new.resize(3 * n_vertices_polygon);
386
387 auto t_coord_polygon_new = get_tensor_vec(v_coord_polygon_new);
388 auto t_coord_polygon = get_tensor_vec(v_coord_polygon);
389
390 std::vector<EntityHandle> conn_polygon(n_vertices_polygon);
391 for (int ii = 0; ii != n_vertices_polygon; ++ii) {
392 t_coord_polygon(0) = solution[0][ii].X / roundfact;
393 t_coord_polygon(1) = solution[0][ii].Y / roundfact;
394 t_coord_polygon(2) += z_shift;
395
396 t_coord_polygon_new(
i) = t_m_rot(
j,
i) * t_coord_polygon(
j);
397
398 coord[0] = t_coord_polygon_new(0);
399 coord[1] = t_coord_polygon_new(1);
400 coord[2] = t_coord_polygon_new(2);
402
403 ++t_coord_polygon_new;
404 ++t_coord_polygon;
405 }
406
409 MBPOLYGON, &conn_polygon[0], n_vertices_polygon, polygon);
410
411
412
413 tris_in_polygon.clear();
414 if (n_vertices_polygon == 3) {
415
417 new_tri_conn[0] = conn_polygon[0];
418 new_tri_conn[1] = conn_polygon[1];
419 new_tri_conn[2] = conn_polygon[2];
422 new_tri);
423
424 tris_in_polygon.insert(new_tri);
425 } else {
427 new_tri_conn[0] = conn_polygon[0];
428 for (int ii = 0; ii != n_vertices_polygon - 2; ++ii) {
429 new_tri_conn[1] = conn_polygon[ii + 1];
430 new_tri_conn[2] = conn_polygon[ii + 2];
431
434 new_tri);
435
436 tris_in_polygon.insert(new_tri);
437 }
438 }
439
440
441
442 contact_commondata_multi_index->insert(
443 boost::shared_ptr<ContactCommonData>(new ContactCommonData(
444 slave_master_1prism, tris_in_polygon)));
445 }
446 }
447
448 if (num_intersections == 0)
449 flag_end_of_search = true;
450
451 }
452 }
453
455 }
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
const double v
phase velocity of light in medium (cm/ns)
FTensor::Index< 'j', 3 > j
std::vector< Path > Paths
UBlasMatrix< double > MatrixDouble
UBlasVector< double > VectorDouble