126 typedef typename G_DCEL_MESH::edge_type g_edge_type;
127 typedef typename G_DCEL_MESH::vertex_type g_vertex_type;
128 typedef typename G_DCEL_MESH::face_type g_face_type;
129 typedef typename B_DCEL_MESH::edge_type b_edge_type;
130 typedef typename B_DCEL_MESH::vertex_type b_vertex_type;
131 typedef typename B_DCEL_MESH::face_type b_face_type;
133 void init(G_DCEL_MESH& g_mesh_, B_DCEL_MESH& b_mesh_,
double tolerancing_ = 1e-5) {
136 tolerancing = tolerancing_;
138 g_edge_type* g_border_edge;
142 for (
typename G_DCEL_MESH::edge_iterator i = g_mesh->edge_begin(); i != g_mesh->edge_end();
145 if (i->face == 0) { g_border_edge = &*i; }
148 for (
typename B_DCEL_MESH::edge_iterator i = b_mesh->edge_begin(); i != b_mesh->edge_end();
151 if (i->face == 0) { b_border_edge = &*i; }
156 std::stack<b_edge_type*> edge_to_process;
160 std::pair<b_vertex_type*, GSubVertex> fsv =
161 green_parent_of_a_blue_vertex_by_brute_force();
162 SubVertex& sv = new_sub_vertex();
163 sv.g_subvertex = fsv.second;
164 sv.b_subvertex.dim = 0;
165 sv.b_subvertex.v = fsv.first;
166 fsv.first->subvertex = &sv;
168 b_vertex_iterator_on_edge iter(fsv.first);
169 for (b_edge_type* e = iter.next(); e != 0; e = iter.next()) {
170 edge_to_process.push(e);
175 std::vector<g_edge_type*> edge_candidate;
176 edge_candidate.reserve(20);
177 std::vector<g_edge_type*> edge_candidate_tmp;
178 edge_candidate_tmp.reserve(20);
179 while (!edge_to_process.empty()) {
180 b_edge_type* b_edge = edge_to_process.top();
184 SubVertex* g_i2 =
static_cast<SubVertex*
>(b_edge->pair->vertex->subvertex);
186 edge_to_process.pop();
187 if (b_edge->subvertex) {
continue; }
189 edge_candidate.clear();
190 switch (g_i2->g_subvertex.dim) {
192 g_edge_type* e_start = g_i2->g_subvertex.v->edge->next;
193 g_edge_type* e = e_start;
195 bool in_g_i1 =
false;
197 switch (g_i1->g_subvertex.dim) {
199 g_vertex_type* v = g_i1->g_subvertex.v;
200 in_g_i1 = v == e->vertex || v == e->pair->vertex;
204 in_g_i1 = g_i1->g_subvertex.e == e
205 || g_i1->g_subvertex.e == e->pair;
208 in_g_i1 = e->face == g_i1->g_subvertex.f;
211 bool ext_but_on_g_i2_face =
false;
213 g_vertex_type* v = g_i2->g_subvertex.v;
214 g_edge_type* e_tmp = e->pair;
216 if (e_tmp->vertex == v) {
217 ext_but_on_g_i2_face =
true;
221 }
while (e_tmp != e->pair);
223 if (!in_g_i1 && !ext_but_on_g_i2_face) {
224 edge_candidate.push_back(e);
227 if (e->vertex == g_i2->g_subvertex.v) { e = e->pair->next; }
228 }
while (e != e_start);
232 g_edge_type* e_start = g_i2->g_subvertex.e->pair;
233 if (g_i1 == 0 && e_start->face == 0) { e_start = e_start->pair; }
234 g_edge_type* e = e_start->next;
236 edge_candidate.push_back(e);
238 }
while (e != e_start);
240 e_start = e_start->pair;
243 if (e->pair->face != e_start->pair->face) {
244 edge_candidate.push_back(e);
247 }
while (e != e_start);
252 g_edge_type* e_start =
253 g_i2->g_subvertex.f ? g_i2->g_subvertex.f->edge : g_border_edge;
254 g_edge_type* e = e_start;
256 edge_candidate.push_back(e);
258 }
while (e != e_start);
267 while (i != edge_candidate.size() && edge_candidate[i]->face != 0) { ++i; }
268 while (i != edge_candidate.size() && edge_candidate[i]->face == 0) { ++i; }
269 if (i != edge_candidate.size()) {
270 edge_candidate_tmp.assign(
271 edge_candidate.begin() + i, edge_candidate.end());
272 edge_candidate_tmp.insert(
273 edge_candidate_tmp.end(), edge_candidate.begin(),
274 edge_candidate.begin() + i);
275 edge_candidate.swap(edge_candidate_tmp);
280 bool first_res =
false;
281 double first_alpha = 0;
282 double first_beta = 0;
284 double last_alpha = -1;
285 double last_beta = -1;
286 bool last_res =
false;
290 SubVertex* best_g_i3 = 0;
291 double best_alpha = 2;
292 size_t i_end = edge_candidate.size();
293 if (edge_candidate.size() > 1
294 && edge_candidate.front()->pair->vertex == edge_candidate.back()->vertex) {
297 for (
size_t i = 0; i != i_end; ++i) {
301 if (i == edge_candidate.size()) {
307 res = edge_intersection(*b_edge, *edge_candidate[i], sv, alpha, beta);
308 if (res && g_i2 && g_i2->b_subvertex.dim == 1
309 && alpha < g_i2->b_subvertex.icoor[0]) {
322 if (std::abs(last_alpha - alpha) < tolerancing) {
324 if (sv.b_subvertex.dim == 0) {
325 if (sv.b_subvertex.v->subvertex == 0) {
327 sv.b_subvertex.v = b_edge->vertex;
329 g_i3 =
static_cast<SubVertex*
>(
330 sv.b_subvertex.v->subvertex);
332 }
else if (last_sv.b_subvertex.dim == 0) {
333 if (last_sv.b_subvertex.v->subvertex == 0) {
335 sv.b_subvertex.dim = 0;
336 sv.b_subvertex.v = b_edge->vertex;
338 g_i3 =
static_cast<SubVertex*
>(
339 last_sv.b_subvertex.v->subvertex);
343 sv.b_subvertex.dim = 1;
344 sv.b_subvertex.e = b_edge;
345 alpha = (last_alpha + alpha) / 2;
346 sv.b_subvertex.icoor[0] = alpha;
348 g_i3->g_subvertex.dim = 0;
349 g_i3->g_subvertex.v =
350 edge_candidate[i - (last_beta > beta ? 1 : 0)]->vertex;
352 if (alpha < last_alpha) {
353 if (sv.b_subvertex.dim == 0
354 && sv.b_subvertex.v->subvertex) {
356 g_i3 =
static_cast<SubVertex*
>(
357 sv.b_subvertex.v->subvertex);
358 if (g_i3->g_subvertex.dim >= last_sv.g_subvertex.dim) {
359 if (g_i3->g_subvertex.dim == 1
360 && last_sv.g_subvertex.dim == 1) {
361 g_i3->g_subvertex.dim = 0;
362 if (g_i3->g_subvertex.icoor[0] < 0.5) {
363 g_i3->g_subvertex.v =
364 g_i3->g_subvertex.e->pair->vertex;
366 g_i3->g_subvertex.v =
367 g_i3->g_subvertex.e->vertex;
370 g_i3->g_subvertex = sv.g_subvertex;
377 if (last_sv.b_subvertex.dim == 0
378 && last_sv.b_subvertex.v->subvertex) {
380 g_i3 =
static_cast<SubVertex*
>(
381 last_sv.b_subvertex.v->subvertex);
382 if (g_i3->g_subvertex.dim >= last_sv.g_subvertex.dim) {
383 if (g_i3->g_subvertex.dim == 1
384 && last_sv.g_subvertex.dim == 1) {
385 g_i3->g_subvertex.dim = 0;
386 if (g_i3->g_subvertex.icoor[0] < 0.5) {
387 g_i3->g_subvertex.v =
388 g_i3->g_subvertex.e->pair->vertex;
390 g_i3->g_subvertex.v =
391 g_i3->g_subvertex.e->vertex;
394 g_i3->g_subvertex = last_sv.g_subvertex;
399 sv.g_subvertex = last_sv.g_subvertex;
400 sv.b_subvertex = last_sv.b_subvertex;
405 if (last_sv.b_subvertex.dim == 0
406 && last_sv.b_subvertex.v->subvertex) {
409 static_cast<SubVertex*
>(last_sv.b_subvertex.v->subvertex);
410 if (g_i3->g_subvertex.dim >= last_sv.g_subvertex.dim) {
411 g_i3->g_subvertex = last_sv.g_subvertex;
415 sv.g_subvertex = last_sv.g_subvertex;
416 sv.b_subvertex = last_sv.b_subvertex;
419 }
else if (!res && last_beta > 1 && beta < 1) {
420 double max_alpha = std::max(last_alpha, alpha);
421 double min_alpha = std::min(last_alpha, alpha);
422 alpha = (last_alpha + alpha) / 2;
423 if (min_alpha > 1 - 2 * tolerancing && max_alpha < 1 + tolerancing) {
425 if (max_alpha < tolerancing) {
426 g_i3 =
static_cast<SubVertex*
>(b_edge->pair->vertex->subvertex);
427 }
else if (min_alpha < 1 - tolerancing) {
429 sv.b_subvertex.dim = 0;
430 sv.b_subvertex.v = b_edge->vertex;
432 if (b_edge->vertex->subvertex) {
433 g_i3 =
static_cast<SubVertex*
>(b_edge->vertex->subvertex);
436 g_i3->b_subvertex.dim = 1;
437 g_i3->b_subvertex.e = b_edge;
438 g_i3->b_subvertex.icoor[0] = alpha;
441 g_i3->g_subvertex.dim = 0;
442 g_i3->g_subvertex.v = edge_candidate[i - 1]->vertex;
445 if (g_i2->g_subvertex.f == 0) {
446 if (g_i3 && g_i3->b_subvertex.dim == 1
447 && g_i3->b_subvertex.icoor[0] < best_alpha) {
450 best_g_i3 = &best_sv;
454 best_alpha = g_i3->b_subvertex.icoor[0];
466 if (g_i3 == 0 && last_res && edge_candidate.size() == i_end) {
467 if (last_sv.b_subvertex.dim == 0 && last_sv.b_subvertex.v->subvertex) {
469 g_i3 =
static_cast<SubVertex*
>(last_sv.b_subvertex.v->subvertex);
470 if (g_i3->g_subvertex.dim >= last_sv.g_subvertex.dim) {
471 g_i3->g_subvertex = last_sv.g_subvertex;
475 sv.g_subvertex = last_sv.g_subvertex;
476 sv.b_subvertex = last_sv.b_subvertex;
478 if (g_i2->g_subvertex.f == 0 && g_i3->b_subvertex.icoor[0] < best_alpha) {
481 best_g_i3 = &best_sv;
485 best_alpha = g_i3->b_subvertex.icoor[0];
489 if (g_i2->g_subvertex.f == 0) {
490 if (best_g_i3 == 0) {
491 if (b_edge->vertex->subvertex == 0) {
492 SubVertex& rsv = new_sub_vertex();
493 rsv.b_subvertex.dim = 0;
494 rsv.b_subvertex.v = b_edge->vertex;
495 rsv.g_subvertex.dim = 2;
496 rsv.g_subvertex.f = 0;
497 std::fill_n(rsv.g_subvertex.icoor, 2, 0.0);
500 g_i3 =
static_cast<SubVertex*
>(b_edge->vertex->subvertex);
503 if (best_g_i3 == &best_sv) {
504 SubVertex& sv = new_sub_vertex();
505 sv.g_subvertex = best_g_i3->g_subvertex;
506 sv.b_subvertex = best_g_i3->b_subvertex;
514 SubVertex& sv = new_sub_vertex();
515 sv.g_subvertex = g_i3->g_subvertex;
516 sv.b_subvertex = g_i3->b_subvertex;
521 if (b_edge->vertex->subvertex == 0) {
522 SubVertex& rsv = new_sub_vertex();
523 rsv.b_subvertex.dim = 0;
524 rsv.b_subvertex.v = b_edge->vertex;
525 rsv.b_subvertex.icoor[0] = rsv.b_subvertex.icoor[1] = 0;
526 std::set<g_face_type*> processed_face;
527 for (
size_t i = 0; i != edge_candidate.size(); ++i) {
528 g_face_type* f = edge_candidate[i]->face;
529 if (f == 0) {
continue; }
530 if (processed_face.insert(f).second) {
532 if (b_point_to_g_face(
533 *rsv.b_subvertex.v, *f, rsv.g_subvertex, dist)) {
541 rsv.g_subvertex.dim = 2;
542 rsv.g_subvertex.f = 0;
543 std::fill_n(rsv.g_subvertex.icoor, 2, 0.0);
547 g_i3 =
static_cast<SubVertex*
>(b_edge->vertex->subvertex);
552 const int g_i2_b_subvertex_dim = g_i2->b_subvertex.dim;
553 if (g_i3->g_subvertex.dim == 0) {
554 if (g_i3->g_subvertex.v->subvertex == 0) {
555 g_i3->g_subvertex.v->subvertex = g_i3;
556 }
else if (g_i3 == &list_subvertex.back()) {
558 static_cast<SubVertex*
>(g_i3->g_subvertex.v->subvertex);
559 if (tmp->b_subvertex.dim != 0 || g_i3->b_subvertex.dim != 0) {
560 cluster_subvertex_on_dcel(tmp, g_i3);
561 list_subvertex.pop_back();
567 if (b_edge < b_edge->pair) {
568 g_i3->b_previous_subvertex = g_i2;
569 g_i2->b_next_subvertex = g_i3;
571 g_i3->b_next_subvertex = g_i2;
572 g_i2->b_previous_subvertex = g_i3;
575 if (g_i3->b_subvertex.dim == 0) { g_i3->b_subvertex.v->subvertex = g_i3; }
576 if (g_i2_b_subvertex_dim == 0 && g_i2 != g_i3) { b_edge->subvertex = g_i3; }
577 if (g_i3->b_subvertex.dim == 0 && g_i3->b_subvertex.v == b_edge->vertex) {
579 b_edge->pair->subvertex = g_i2;
581 b_edge->pair->subvertex = g_i1;
583 b_edge->vertex->subvertex = g_i3;
592 b_vertex_iterator_on_edge iter(b_edge->vertex);
593 for (b_edge_type* e = iter.next(); e != 0; e = iter.next()) {
594 edge_to_process.push(e);
601 for (
typename list_subvertex_t::iterator sv = list_subvertex.begin();
602 sv != list_subvertex.end(); ++sv) {
603 if (sv->b_subvertex.dim == 1) {
604 b_edge_type* e = sv->b_subvertex.e;
606 sv->b_subvertex.e = e->pair;
607 sv->b_subvertex.icoor[0] = 1 - sv->b_subvertex.icoor[0];
610 if (sv->g_subvertex.dim == 1) {
611 g_edge_type* e = sv->g_subvertex.e;
613 sv->g_subvertex.e = e->pair;
614 sv->g_subvertex.icoor[0] = 1 - sv->g_subvertex.icoor[0];
620 std::cout <<
"B VERTEX" << std::endl;
621 for (
size_t i = 0; i != b_mesh->list_vertex.size(); ++i) {
622 b_vertex_type& v = b_mesh->list_vertex[i];
623 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
626 std::cout <<
"B EDGE" << std::endl;
627 for (
size_t i = 0; i != b_mesh->list_edge.size(); ++i) {
628 b_edge_type& e = b_mesh->list_edge[i];
629 SubVertex* sv =
static_cast<SubVertex*
>(e.subvertex);
630 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
631 <<
", sv = " << get_subvertex_id(sv);
633 std::cout <<
", sv dim = " << sv->b_subvertex.dim
634 <<
", sv icoor = " << sv->b_subvertex.icoor[0];
636 std::cout << std::endl;
639 std::cout <<
"G VERTEX" << std::endl;
640 for (
size_t i = 0; i != g_mesh->list_vertex.size(); ++i) {
641 g_vertex_type& v = g_mesh->list_vertex[i];
642 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
645 std::cout <<
"G EDGE" << std::endl;
646 for (
size_t i = 0; i != g_mesh->list_edge.size(); ++i) {
647 g_edge_type& e = g_mesh->list_edge[i];
648 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
649 <<
", sv = " << get_subvertex_id(e.subvertex) << std::endl;
652 std::cout <<
"SUBVERTEX" << std::endl;
653 for (
size_t i = 0; i != list_subvertex.size(); ++i) { print_subvertex(list_subvertex[i]); }
654 std::cout << std::endl;
659 typedef std::list<std::pair<g_edge_type*, SubVertex*> > list_sv_t;
662 for (
typename B_DCEL_MESH::face_iterator bf = b_mesh->face_begin();
663 bf != b_mesh->face_end(); ++bf) {
665 b_edge_type* b_edge = bf->edge;
666 b_edge_type* b_edge_start = b_edge;
668 SubVertex* sv =
static_cast<SubVertex*
>(b_edge->subvertex);
670 if (sv->g_subvertex.dim == 1) {
671 g_edge_type* e = sv->g_subvertex.e;
672 if (e > e->pair) { e = e->pair; }
673 list_sv.push_back(std::pair<g_edge_type*, SubVertex*>(e, sv));
674 }
else if (sv->g_subvertex.dim == 0) {
675 g_vertex_iterator_on_edge iter(sv->g_subvertex.v);
676 for (g_edge_type* e = iter.next(); e != 0; e = iter.next()) {
677 list_sv.push_back(std::pair<g_edge_type*, SubVertex*>(
678 e->pair < e ? e->pair : e, sv));
681 if (sv->b_subvertex.dim == 0) {
break; }
682 if (b_edge < b_edge->pair) {
683 sv = sv->b_next_subvertex;
685 sv = sv->b_previous_subvertex;
688 b_edge = b_edge->next;
689 }
while (b_edge != b_edge_start);
691 if (list_sv.size() < 2) {
continue; }
693 list_sv.sort(CompSV());
697 std::cout <<
"for face " << bf->id << std::endl;
698 for (
typename list_sv_t::iterator i = list_sv.begin(); i != list_sv.end();
700 std::cout << i->first <<
", ";
701 print_subvertex(*i->second);
708 typename list_sv_t::iterator i_in = list_sv.begin();
710 while (i_in != list_sv.end()) {
711 typename list_sv_t::iterator i_in1 = i_in;
714 while (i_in1 != list_sv.end() && i_in1->first == i_in->first) {
718 if (s > 2 && bf != b_mesh->face_end()) {
719 typedef std::deque<std::pair<double, typename list_sv_t::iterator> >
721 list_diff_t list_diff;
722 for (
typename list_sv_t::iterator i = i_in; i != i_in1; ++i) {
723 if (i->second->g_subvertex.dim == 0) {
724 if (i->second->g_subvertex.v == i->first->vertex) {
725 list_diff.push_back(
typename list_diff_t::value_type(1, i));
727 list_diff.push_back(
typename list_diff_t::value_type(0, i));
730 list_diff.push_back(
typename list_diff_t::value_type(
731 i->second->g_subvertex.icoor[0], i));
734 for (
size_t i = 0; i != list_diff.size() - 1; ++i) {
735 list_diff[i].first = list_diff[i + 1].first - list_diff[i].first;
737 list_diff.pop_back();
738 std::sort(list_diff.begin(), list_diff.end(), CompareFirstOfPair());
740 while (list_diff.size() > 1) {
741 typename list_sv_t::iterator a = list_diff.front().second;
742 typename list_sv_t::iterator b = a;
744 cluster_subvertex_on_dcel(a->second, b->second);
745 while (i_in1 != list_sv.end() && i_in1->second == b->second) {
749 SubVertex* v = b->second;
750 for (
typename list_sv_t::iterator i = i_in;
751 i != list_sv.end();) {
752 if (i->second == v) {
753 i = list_sv.erase(i);
759 list_diff.pop_front();
768 std::cout <<
"after remove extra subvertex on face " << bf->id << std::endl;
769 for (
typename list_sv_t::iterator i = list_sv.begin(); i != list_sv.end();
771 std::cout << i->first <<
", ";
772 print_subvertex(*i->second);
777 typename list_sv_t::iterator i_end = list_sv.end();
779 for (
typename list_sv_t::iterator i = list_sv.begin(); i != i_end; ++i) {
780 typename list_sv_t::iterator j = i;
782 if (j->first == i->first) {
783 SubVertex* sv1 = j->second;
784 SubVertex* sv2 = i->second;
785 if (sv1->g_subvertex.dim == 1 && sv2->g_subvertex.dim == 1) {
786 if (sv1->g_subvertex.icoor[0] > sv2->g_subvertex.icoor[0]) {
789 }
else if (sv1->g_subvertex.dim == 1 || sv2->g_subvertex.dim == 1) {
790 if (sv1->g_subvertex.dim == 1) { std::swap(sv1, sv2); }
791 if (sv2->g_subvertex.e->vertex == sv1->g_subvertex.v) {
795 sv1->g_next_subvertex = sv2;
796 sv2->g_previous_subvertex = sv1;
803 std::cout <<
"B VERTEX" << std::endl;
804 for (
size_t i = 0; i != b_mesh->list_vertex.size(); ++i) {
805 b_vertex_type& v = b_mesh->list_vertex[i];
806 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
809 std::cout <<
"B EDGE" << std::endl;
810 for (
size_t i = 0; i != b_mesh->list_edge.size(); ++i) {
811 b_edge_type& e = b_mesh->list_edge[i];
812 SubVertex* sv =
static_cast<SubVertex*
>(e.subvertex);
813 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
814 <<
", sv = " << get_subvertex_id(sv);
816 std::cout <<
", sv dim = " << sv->b_subvertex.dim
817 <<
", sv icoor = " << sv->b_subvertex.icoor[0];
819 std::cout << std::endl;
822 std::cout <<
"G VERTEX" << std::endl;
823 for (
size_t i = 0; i != g_mesh->list_vertex.size(); ++i) {
824 g_vertex_type& v = g_mesh->list_vertex[i];
825 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
828 std::cout <<
"G EDGE" << std::endl;
829 for (
size_t i = 0; i != g_mesh->list_edge.size(); ++i) {
830 g_edge_type& e = g_mesh->list_edge[i];
831 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
832 <<
", sv = " << get_subvertex_id(e.subvertex) << std::endl;
835 std::cout <<
"SUBVERTEX" << std::endl;
836 for (
size_t i = 0; i != list_subvertex.size(); ++i) { print_subvertex(list_subvertex[i]); }
837 std::cout << std::endl;
841 for (
typename B_DCEL_MESH::face_iterator bf = b_mesh->face_begin();
842 bf != b_mesh->face_end(); ++bf) {
843 std::vector<void*> list_b_cell;
844 list_b_cell.push_back(&*bf);
845 b_edge_type* be_start;
848 b_edge_type* be = be_start;
850 list_b_cell.push_back(be);
851 list_b_cell.push_back(be->vertex);
853 }
while (be != be_start);
854 std::sort(list_b_cell.begin(), list_b_cell.end());
858 SubVertex* sv =
static_cast<SubVertex*
>(be->subvertex);
860 if (sv->g_subvertex.dim == 0) {
861 g_vertex_iterator_on_edge iter(sv->g_subvertex.v);
862 for (g_edge_type* ge = iter.next(); ge != 0; ge = iter.next()) {
863 if (!ge->subvertex) {
864 try_g_vertice_on_blue_face(&*bf, list_b_cell, ge);
868 sv->g_subvertex.dim == 1
869 && !((sv->g_previous_subvertex && sv->g_next_subvertex)
870 || (sv->g_previous_subvertex
871 && std::binary_search(
872 list_b_cell.begin(), list_b_cell.end(),
873 sv->g_previous_subvertex->g_subvertex.v))
874 || (sv->g_next_subvertex
875 && std::binary_search(
876 list_b_cell.begin(), list_b_cell.end(),
877 sv->g_next_subvertex->g_subvertex.v)))) {
879 if (!sv->g_next_subvertex) {
880 res = try_g_vertice_on_blue_face(&*bf, list_b_cell, sv->g_subvertex.e);
882 if (!res && sv->g_previous_subvertex) {
883 try_g_vertice_on_blue_face(&*bf, list_b_cell, sv->g_subvertex.e->pair);
887 if (sv->b_subvertex.dim == 1) {
888 if (sv->b_subvertex.e == be) {
889 sv = sv->b_next_subvertex;
891 assert(sv->b_subvertex.e->pair == be);
892 sv = sv->b_previous_subvertex;
899 }
while (be != be_start);
903 std::cout <<
"B VERTEX" << std::endl;
904 for (
size_t i = 0; i != b_mesh->list_vertex.size(); ++i) {
905 b_vertex_type& v = b_mesh->list_vertex[i];
906 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
909 std::cout <<
"B EDGE" << std::endl;
910 for (
size_t i = 0; i != b_mesh->list_edge.size(); ++i) {
911 b_edge_type& e = b_mesh->list_edge[i];
912 SubVertex* sv =
static_cast<SubVertex*
>(e.subvertex);
913 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
914 <<
", sv = " << get_subvertex_id(sv);
916 std::cout <<
", sv dim = " << sv->b_subvertex.dim
917 <<
", sv icoor = " << sv->b_subvertex.icoor[0];
919 std::cout << std::endl;
922 std::cout <<
"G VERTEX" << std::endl;
923 for (
size_t i = 0; i != g_mesh->list_vertex.size(); ++i) {
924 g_vertex_type& v = g_mesh->list_vertex[i];
925 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
928 std::cout <<
"G EDGE" << std::endl;
929 for (
size_t i = 0; i != g_mesh->list_edge.size(); ++i) {
930 g_edge_type& e = g_mesh->list_edge[i];
931 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id
932 <<
", sv = " << get_subvertex_id(e.subvertex) << std::endl;
935 std::cout <<
"SUBVERTEX" << std::endl;
936 for (
size_t i = 0; i != list_subvertex.size(); ++i) { print_subvertex(list_subvertex[i]); }
937 std::cout << std::endl;
940 for (
typename B_DCEL_MESH::vertex_iterator v = b_mesh->vertex_begin();
941 v != b_mesh->vertex_end(); ++v) {
942 if (v->subvertex &&
static_cast<SubVertex*
>(v->subvertex)->g_subvertex.dim == 0) {}
950 for (
typename G_DCEL_MESH::vertex_iterator v = g_mesh->vertex_begin();
951 v != g_mesh->vertex_end(); ++v) {
952 if (v->subvertex == 0) {
953 SubVertex& sv = new_sub_vertex();
955 sv.b_subvertex.dim = 2;
956 sv.b_subvertex.f = 0;
957 std::fill_n(sv.b_subvertex.icoor, 2, 0.0);
958 sv.g_subvertex.dim = 0;
959 sv.g_subvertex.v = &*v;
962 for (
typename list_subvertex_t::iterator sv = list_subvertex.begin();
963 sv != list_subvertex.end(); ++sv) {
964 if (sv->g_subvertex.dim == 1) {
965 if (sv->g_next_subvertex == 0) {
966 sv->g_subvertex.e->pair->subvertex = &*sv;
967 sv->g_next_subvertex =
968 static_cast<SubVertex*
>(sv->g_subvertex.e->vertex->subvertex);
969 sv->g_next_subvertex->g_previous_subvertex = &*sv;
970 }
else if (sv->g_next_subvertex->g_subvertex.dim == 0) {
971 sv->g_subvertex.e->pair->subvertex = &*sv;
973 if (sv->g_previous_subvertex == 0) {
974 sv->g_subvertex.e->subvertex = &*sv;
975 sv->g_previous_subvertex =
976 static_cast<SubVertex*
>(sv->g_subvertex.e->pair->vertex->subvertex);
977 sv->g_previous_subvertex->g_next_subvertex = &*sv;
978 }
else if (sv->g_previous_subvertex->g_subvertex.dim == 0) {
979 sv->g_subvertex.e->subvertex = &*sv;
983 for (
typename G_DCEL_MESH::edge_iterator e = g_mesh->edge_begin(); e != g_mesh->edge_end();
985 if (e->subvertex == 0) { e->subvertex = e->vertex->subvertex; }
989 std::cout <<
"B VERTEX" << std::endl;
990 for (
size_t i = 0; i != b_mesh->list_vertex.size(); ++i) {
991 b_vertex_type& v = b_mesh->list_vertex[i];
992 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
995 std::cout <<
"B EDGE" << std::endl;
996 for (
size_t i = 0; i != b_mesh->list_edge.size(); ++i) {
997 b_edge_type& e = b_mesh->list_edge[i];
998 SubVertex* sv =
static_cast<SubVertex*
>(e.subvertex);
999 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id <<
", ptr = " << &e
1000 <<
", sv = " << get_subvertex_id(sv);
1002 std::cout <<
", sv dim = " << sv->b_subvertex.dim
1003 <<
", sv icoor = " << sv->b_subvertex.icoor[0];
1005 std::cout << std::endl;
1008 std::cout <<
"G VERTEX" << std::endl;
1009 for (
size_t i = 0; i != g_mesh->list_vertex.size(); ++i) {
1010 g_vertex_type& v = g_mesh->list_vertex[i];
1011 std::cout <<
"id = " << v.id <<
", sv = " << get_subvertex_id(v.subvertex) << std::endl;
1014 std::cout <<
"G EDGE" << std::endl;
1015 for (
size_t i = 0; i != g_mesh->list_edge.size(); ++i) {
1016 g_edge_type& e = g_mesh->list_edge[i];
1017 std::cout <<
"id = " << e.pair->vertex->id <<
", " << e.vertex->id <<
", ptr = " << &e
1018 <<
", sv = " << get_subvertex_id(e.subvertex) << std::endl;
1021 std::cout <<
"SUBVERTEX" << std::endl;
1022 for (
size_t i = 0; i != list_subvertex.size(); ++i) { print_subvertex(list_subvertex[i]); }
1023 std::cout << std::endl;
1025 std::cout <<
"branch 3" << std::endl;
1026 std::cout <<
"nodes" << std::endl;
1027 for (
size_t i = 0; i != list_subvertex.size(); ++i) {
1028 std::cout << i + 1 <<
" ";
1029 print_subvertex_bcoor(list_subvertex[i]);
1030 std::cout << std::endl;
1032 std::cout <<
"end\nelements\n type PMASS3\n mass_coefficients_3 0.1 0.1 0.1\n1 "
1036 std::cout <<
"branch 4" << std::endl;
1037 std::cout <<
"nodes" << std::endl;
1038 for (
size_t i = 0; i != list_subvertex.size(); ++i) {
1039 std::cout << i + 1 <<
" ";
1040 print_subvertex_gcoor(list_subvertex[i]);
1041 std::cout << std::endl;
1043 std::cout <<
"end\nelements\n type PMASS3\n mass_coefficients_3 0.1 0.1 0.1\n1 "
1060 b_face(parent_.b_mesh->face_begin()),
1061 b_face_end(parent_.b_mesh->face_end()),
1062 non_overlapping_triangle(non_overlapping_triangle_) {}
1064 template <
typename TRIANGLE>
1065 bool next(TRIANGLE& triangle) {
1067 if (b_face == b_face_end && !non_overlapping_triangle) {
return false; }
1069 list_in_edge_of_b_face_t list_sv;
1070 if (stack.empty()) {
1074 b_edge_type* b_edge;
1075 if (b_face == b_face_end) {
1076 b_edge = parent.b_border_edge;
1078 b_edge = b_face->edge;
1080 b_edge_type* b_edge_end = b_edge;
1082 typename parent_type::SubVertex* v =
1083 static_cast<typename parent_type::SubVertex*
>(b_edge->subvertex);
1085 list_sv.push_back(v);
1086 if (v->b_subvertex.dim == 0) {
break; }
1087 if (b_face == b_face_end) {
1088 if (b_edge < b_edge->pair) {
1089 v = v->b_previous_subvertex;
1091 v = v->b_next_subvertex;
1093 }
else if (b_edge < b_edge->pair) {
1094 v = v->b_next_subvertex;
1096 v = v->b_previous_subvertex;
1099 b_edge = b_edge->next;
1100 }
while (b_edge != b_edge_end);
1102 list_sv.swap(stack.top());
1107 std::cout <<
"SUBV start" << std::endl;
1108 for (
typename list_in_edge_of_b_face_t::iterator i = list_sv.begin();
1109 i != list_sv.end(); ++i) {
1110 parent.print_subvertex(**i);
1112 std::cout << std::endl;
1115 triangle.b_face = b_face == b_face_end ? 0 : &*b_face;
1116 typename list_in_edge_of_b_face_t::iterator sv1 = list_sv.begin();
1117 typename list_in_edge_of_b_face_t::iterator sv2 = sv1;
1119 bool list_sv_non_overlapping_polygon =
false;
1121 triangle.g_face = get_face((*sv1)->g_subvertex, (*sv2)->g_subvertex);
1122 }
catch (std::exception& e) { list_sv_non_overlapping_polygon =
true; }
1123 if (!list_sv_non_overlapping_polygon && triangle.g_face == 0) {
1124 typename parent_type::SubVertex* sv1_value = *sv1;
1126 list_sv.splice(list_sv.end(), list_sv, sv1);
1127 sv1 = list_sv.begin();
1128 if (sv1_value == *sv1) {
break; }
1131 triangle.g_face = get_face((*sv1)->g_subvertex, (*sv2)->g_subvertex);
1132 if (triangle.g_face != 0) {
break; }
1134 if (sv1_value == *sv1) {
1136 if (!non_overlapping_triangle) {
1137 list_sv_non_overlapping_polygon =
true;
1144 if (!list_sv_non_overlapping_polygon) {
1147 sv3 = get_third_subvertex(*sv1, *sv2, triangle.g_face, triangle.b_face);
1148 }
catch (std::exception& e) { ; }
1152 parent.print_subvertex(**sv1);
1154 parent.print_subvertex(**sv2);
1156 parent.print_subvertex(*sv3);
1157 std::cout << std::endl;
1160 set_coor_in_triangle(triangle, *sv1, 0);
1161 set_coor_in_triangle(triangle, *sv2, 1);
1162 set_coor_in_triangle(triangle, sv3, 2);
1165 typename list_in_edge_of_b_face_t::iterator sv3_iter =
1166 std::find(sv2, list_sv.end(), sv3);
1167 if (sv3_iter == list_sv.end()) {
1169 list_sv.insert(sv2, sv3);
1170 stack.push(list_in_edge_of_b_face_t());
1171 list_sv.swap(stack.top());
1174 typename list_in_edge_of_b_face_t::iterator tmp = sv3_iter;
1175 if (tmp == list_sv.begin()) { tmp = list_sv.end(); }
1178 stack.push(list_in_edge_of_b_face_t());
1179 stack.top().splice(stack.top().end(), list_sv, sv2, sv3_iter);
1180 stack.top().push_back(sv3);
1183 std::cout <<
"SUBV push" << std::endl;
1184 for (
typename list_in_edge_of_b_face_t::iterator i =
1186 i != list_sv.end(); ++i) {
1187 parent.print_subvertex(**i);
1189 std::cout << std::endl;
1196 if (tmp == list_sv.end()) { tmp = list_sv.begin(); }
1198 stack.push(list_in_edge_of_b_face_t());
1199 list_sv.swap(stack.top());
1207 if (stack.empty()) {
1208 if (b_face == b_face_end) {
1209 assert(non_overlapping_triangle ==
true);
1210 non_overlapping_triangle =
false;
1211 if (triangle.b_face != 0 || triangle.g_face != 0) {
return true; }
1216 if ((non_overlapping_triangle && (triangle.b_face != 0 || triangle.g_face != 0))
1217 || (triangle.b_face != 0 && triangle.g_face != 0)) {
1224 template <
typename TRIANGLE>
1225 static void set_coor_in_triangle(
1226 TRIANGLE& triangle,
typename parent_type::SubVertex* sv,
int coor_id) {
1227 if (triangle.g_face != 0) {
1229 *triangle.g_face, sv->g_subvertex, triangle.internal_coor_g[coor_id]);
1231 if (triangle.b_face != 0) {
1233 *triangle.b_face, sv->b_subvertex, triangle.internal_coor_b[coor_id]);
1237 template <
typename FACE_TYPE,
typename XSUBVERTEX>
1238 static void get_internal_coor(
1239 const FACE_TYPE& face,
const XSUBVERTEX& sv,
double icoor[2]) {
1242 typename FACE_TYPE::edge_type* e = face.edge;
1243 if (e->vertex == sv.v) {
1244 icoor[0] = icoor[1] = 0;
1248 if (e->vertex == sv.v) {
1253 assert(e->next->vertex == sv.v);
1259 typename FACE_TYPE::edge_type* e = face.edge;
1260 typename FACE_TYPE::edge_type* sve = sv.e < sv.e->pair ? sv.e : sv.e->pair;
1261 const double c = sv.icoor[0];
1267 if (e == sve->pair) {
1278 if (e == sve->pair) {
1289 assert(e == sve->pair);
1295 std::copy(sv.icoor, sv.icoor + 2, icoor);
1300 template <
typename SUB_VERTEX>
1301 static typename SUB_VERTEX::dcel_mesh_type::face_type* get_face(
1302 SUB_VERTEX& sv1, SUB_VERTEX& sv2) {
1303 typedef typename SUB_VERTEX::dcel_mesh_type::face_type face_type;
1304 if (sv1.dim == 2) {
return sv1.f; }
1305 if (sv2.dim == 2) {
return sv2.f; }
1306 if (sv1.dim == 1 && sv2.dim == 1) {
1307 if (sv1.e == sv2.e) {
1308 if (sv1.icoor[0] < sv2.icoor[0]) {
1311 return sv1.e->pair->face;
1314 face_type* f11 = sv1.e->face;
1315 face_type* f21 = sv2.e->face;
1316 if (f11 == f21) {
return f11; }
1317 if (sv2.e->pair->face == 0) {
return f21; }
1318 face_type* f12 = sv1.e->pair->face;
1319 if (f12 == f21) {
return f12; }
1320 assert(sv2.e->pair->face != 0);
1321 return sv2.e->pair->face;
1323 if (sv1.dim == 0 && sv2.dim == 0) {
1324 typename SUB_VERTEX::dcel_mesh_type::edge_type* e = sv1.v->edge;
1326 if (e->vertex == sv2.v) {
return e->face; }
1328 }
while (e != sv1.v->edge);
1331 if (e->vertex == sv1.v) {
return e->pair->face; }
1333 }
while (e != sv2.v->edge);
1336 std::vector<void*> sv1_face;
1337 sv1_face.reserve(10);
1340 sv1_face.push_back(e->face);
1342 }
while (e != sv1.v->edge);
1343 std::sort(sv1_face.begin(), sv1_face.end());
1346 if (std::find(sv1_face.begin(), sv1_face.end(), e->face)
1347 != sv1_face.end()) {
1351 }
while (e != sv2.v->edge);
1356 typename SUB_VERTEX::dcel_mesh_type::edge_type* e = sv2.e;
1358 if (e->vertex == sv1.v) {
1359 if (e == sv2.e) { e = e->pair; }
1363 }
while (e != sv2.e);
1366 if (e->vertex == sv1.v) {
1367 if (e == sv2.e->pair) { e = e->pair; }
1371 }
while (e != sv2.e->pair);
1373 typename SUB_VERTEX::dcel_mesh_type::edge_type* e = sv1.e;
1375 if (e->vertex == sv2.v) {
1376 if (e->next == sv1.e) { e = e->next->pair; }
1380 }
while (e != sv1.e);
1383 if (e->vertex == sv2.v) {
1384 if (e->next == sv1.e->pair) { e = e->next->pair; }
1388 }
while (e != sv1.e->pair);
1390#ifndef AVOID_PROBLEM_IN_TRIANGLE_ITERATOR
1393 throw std::exception();
1397 static typename parent_type::SubVertex* get_third_subvertex(
1398 typename parent_type::SubVertex* sv1,
typename parent_type::SubVertex* sv2,
1399 typename parent_type::g_face_type* g_face,
1400 typename parent_type::b_face_type* b_face) {
1402 if (sv2->b_subvertex.dim == 1) {
1403 sv3 = sv2->b_next_subvertex;
1404 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1405 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1408 sv3 = sv2->b_previous_subvertex;
1409 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1410 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1414 if (sv2->g_subvertex.dim == 1) {
1415 sv3 = sv2->g_next_subvertex;
1416 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1417 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1420 sv3 = sv2->g_previous_subvertex;
1421 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1422 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1427 if (sv2->b_subvertex.dim == 0) {
1428 b_vertex_iterator_on_edge iter(sv2->b_subvertex.v);
1429 for (b_edge_type* e = iter.next(); e != 0; e = iter.next()) {
1430 sv3 =
static_cast<SubVertex*
>(e->subvertex);
1431 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1432 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1438 if (sv2->g_subvertex.dim == 0) {
1439 g_vertex_iterator_on_edge iter(sv2->g_subvertex.v);
1440 for (g_edge_type* e = iter.next(); e != 0; e = iter.next()) {
1441 sv3 =
static_cast<SubVertex*
>(e->subvertex);
1442 if (sv3 != sv1 && get_face(sv2->g_subvertex, sv3->g_subvertex) == g_face
1443 && get_face(sv2->b_subvertex, sv3->b_subvertex) == b_face) {
1448#ifndef AVOID_PROBLEM_IN_TRIANGLE_ITERATOR
1455 typename B_DCEL_MESH::face_iterator b_face;
1456 typename B_DCEL_MESH::face_iterator b_face_end;
1457 typedef std::list<typename parent_type::SubVertex*> list_in_edge_of_b_face_t;
1458 typedef std::stack<list_in_edge_of_b_face_t> stack_t;
1460 bool non_overlapping_triangle;
1468 friend class OverlayingMeshIterator;
1470 class b_vertex_iterator_on_edge {
1472 b_vertex_iterator_on_edge(b_vertex_type* v_) : v(v_), e(v_->edge) {}
1474 b_edge_type* next() {
1475 b_edge_type* res = e;
1478 if (e == v->edge) { e = 0; }
1488 class g_vertex_iterator_on_edge {
1490 g_vertex_iterator_on_edge(g_vertex_type* v_) : v(v_), e(v_->edge) {}
1492 g_edge_type* next() {
1493 g_edge_type* res = e;
1496 if (e == v->edge) { e = 0; }
1513 bool operator<(
const GCell& c)
const {
return v < c.v; }
1523 bool operator<(
const BCell& c)
const {
return v < c.v; }
1526 struct GSubVertex :
public GCell {
1527 typedef G_DCEL_MESH dcel_mesh_type;
1531 struct BSubVertex :
public BCell {
1532 typedef B_DCEL_MESH dcel_mesh_type;
1537 GSubVertex g_subvertex;
1538 BSubVertex b_subvertex;
1539 SubVertex* g_previous_subvertex;
1540 SubVertex* g_next_subvertex;
1541 SubVertex* b_previous_subvertex;
1542 SubVertex* b_next_subvertex;
1547 const std::pair<g_edge_type*, SubVertex*>& a,
1548 const std::pair<g_edge_type*, SubVertex*>& b) {
1549 if (a.first == b.first) {
1551 if (a.second->g_subvertex.dim == 1) {
1552 ac = a.second->g_subvertex.icoor[0];
1554 assert(a.second->g_subvertex.dim == 0);
1555 if (a.second->g_subvertex.v == a.first->vertex) {
1562 if (b.second->g_subvertex.dim == 1) {
1563 bc = b.second->g_subvertex.icoor[0];
1565 assert(b.second->g_subvertex.dim == 0);
1566 if (b.second->g_subvertex.v == b.first->vertex) {
1574 return a.first < b.first;
1579 void print_subvertex(
const SubVertex& sv)
const {
1580 std::cout <<
"sv=" << get_subvertex_id(&sv) <<
", ptr = " << &sv << std::endl;
1581 const GSubVertex& gsv = sv.g_subvertex;
1582 std::cout <<
" g: dim = " << gsv.dim <<
", id = ";
1585 std::cout << gsv.v->id;
1588 std::cout << gsv.e->pair->vertex->id <<
", " << gsv.e->vertex->id <<
", coor = ("
1589 << gsv.icoor[0] <<
")";
1593 std::cout << gsv.f->id <<
", coor = (" << gsv.icoor[0] <<
", " << gsv.icoor[1]
1600 std::cout <<
", prev = " << get_subvertex_id(sv.g_previous_subvertex)
1601 <<
", next = " << get_subvertex_id(sv.g_next_subvertex) << std::endl;
1602 const BSubVertex& bsv = sv.b_subvertex;
1603 std::cout <<
" b: dim = " << bsv.dim <<
", id = ";
1606 std::cout << bsv.v->id;
1609 std::cout << bsv.e->pair->vertex->id <<
", " << bsv.e->vertex->id <<
", coor = ("
1610 << bsv.icoor[0] <<
")";
1614 std::cout << bsv.f->id <<
", coor = (" << bsv.icoor[0] <<
", " << bsv.icoor[1]
1621 std::cout <<
", prev = " << get_subvertex_id(sv.b_previous_subvertex)
1622 <<
", next = " << get_subvertex_id(sv.b_next_subvertex) << std::endl;
1625 void print_subvertex_gcoor(
const SubVertex& sv)
const {
1626 const GSubVertex& gsv = sv.g_subvertex;
1629 std::cout << gsv.v->coor[0] <<
" " << gsv.v->coor[1] <<
" " << gsv.v->coor[2];
1632 for (
int i = 0; i != 3; ++i) {
1633 std::cout << gsv.e->vertex->coor[i] * gsv.icoor[0]
1634 + gsv.e->pair->vertex->coor[i] * (1 - gsv.icoor[0])
1641 g_edge_type* e = gsv.f->edge;
1642 double* c0 = e->vertex->coor;
1644 double* c1 = e->vertex->coor;
1646 double* c2 = e->vertex->coor;
1647 const double h[3] = {
1648 1 - gsv.icoor[0] - gsv.icoor[1], gsv.icoor[0], gsv.icoor[1]};
1649 for (
int i = 0; i != 3; ++i) {
1650 std::cout << c0[i] * h[0] + c1[i] * h[1] + c2[i] * h[2] <<
" ";
1653 std::cout <<
"-1 -1 -1";
1659 void print_subvertex_bcoor(
const SubVertex& sv)
const {
1660 const BSubVertex& gsv = sv.b_subvertex;
1663 std::cout << gsv.v->coor[0] <<
" " << gsv.v->coor[1] <<
" " << gsv.v->coor[2];
1666 for (
int i = 0; i != 3; ++i) {
1667 std::cout << gsv.e->vertex->coor[i] * gsv.icoor[0]
1668 + gsv.e->pair->vertex->coor[i] * (1 - gsv.icoor[0])
1675 b_edge_type* e = gsv.f->edge;
1676 double* c0 = e->vertex->coor;
1678 double* c1 = e->vertex->coor;
1680 double* c2 = e->vertex->coor;
1681 const double h[3] = {
1682 1 - gsv.icoor[0] - gsv.icoor[1], gsv.icoor[0], gsv.icoor[1]};
1683 for (
int i = 0; i != 3; ++i) {
1684 std::cout << c0[i] * h[0] + c1[i] * h[1] + c2[i] * h[2] <<
" ";
1687 std::cout <<
"-1 -1 -1";
1693 void cluster_subvertex_on_dcel(SubVertex* a, SubVertex* b) {
1695 if (a->b_subvertex.dim > b->b_subvertex.dim) {
1696 if (a->b_subvertex.dim == 1) {
1697 if (a->b_subvertex.e->subvertex == a) {
1698 if (a->b_subvertex.e < a->b_subvertex.e->pair) {
1699 a->b_subvertex.e->subvertex =
1700 a->b_next_subvertex == b ? a : a->b_next_subvertex;
1702 a->b_subvertex.e->subvertex =
1703 a->b_previous_subvertex == b ? a : a->b_previous_subvertex;
1706 if (a->b_subvertex.e->pair->subvertex == a) {
1707 if (a->b_subvertex.e->pair < a->b_subvertex.e) {
1708 a->b_subvertex.e->pair->subvertex =
1709 a->b_next_subvertex == b ? a : a->b_next_subvertex;
1711 a->b_subvertex.e->pair->subvertex =
1712 a->b_previous_subvertex == b ? a : a->b_previous_subvertex;
1716 if (a->b_previous_subvertex) {
1717 a->b_previous_subvertex->b_next_subvertex = a->b_next_subvertex;
1719 if (a->b_next_subvertex) {
1720 a->b_next_subvertex->b_previous_subvertex = a->b_previous_subvertex;
1722 if (b->b_subvertex.dim == 0) {
1723 if (b->b_subvertex.v->subvertex == b) { b->b_subvertex.v->subvertex = a; }
1724 b_edge_type* e = b->b_subvertex.v->edge;
1725 b_edge_type* e_end = e;
1728 SubVertex* sv =
static_cast<SubVertex*
>(e->subvertex);
1729 if (sv->b_next_subvertex == b) { sv->b_next_subvertex = a; }
1730 if (sv->b_previous_subvertex == b) { sv->b_previous_subvertex = a; }
1731 if (e->pair->subvertex == b) { e->pair->subvertex = a; }
1734 }
while (e != e_end);
1735 }
else if (b->b_subvertex.dim == 1) {
1736 if (b->b_subvertex.e->subvertex == b) { b->b_subvertex.e->subvertex = a; }
1737 if (b->b_subvertex.e->pair->subvertex == b) {
1738 b->b_subvertex.e->pair->subvertex = a;
1741 if (b->b_previous_subvertex && b->b_previous_subvertex->b_next_subvertex == b) {
1742 b->b_previous_subvertex->b_next_subvertex = a;
1744 if (b->b_next_subvertex && b->b_next_subvertex->b_previous_subvertex == b) {
1745 b->b_next_subvertex->b_previous_subvertex = a;
1747 std::swap(a->b_subvertex, b->b_subvertex);
1749 if (b->b_subvertex.dim == 1) {
1750 if (b->b_subvertex.e->subvertex == b) {
1751 if (b->b_subvertex.e < b->b_subvertex.e->pair) {
1752 b->b_subvertex.e->subvertex = b->b_next_subvertex;
1754 b->b_subvertex.e->subvertex = b->b_previous_subvertex;
1757 if (b->b_subvertex.e->pair->subvertex == b) {
1758 if (b->b_subvertex.e->pair < b->b_subvertex.e) {
1759 b->b_subvertex.e->pair->subvertex = b->b_next_subvertex;
1761 b->b_subvertex.e->pair->subvertex = b->b_previous_subvertex;
1765 if (b->b_previous_subvertex) {
1766 b->b_previous_subvertex->b_next_subvertex = b->b_next_subvertex;
1768 if (b->b_next_subvertex) {
1769 b->b_next_subvertex->b_previous_subvertex = b->b_previous_subvertex;
1771 if (b->b_subvertex.dim == 0) {
1772 if (b->b_subvertex.v->subvertex == b) { b->b_subvertex.v->subvertex = a; }
1773 b_edge_type* e = b->b_subvertex.v->edge;
1774 b_edge_type* e_end = e;
1777 SubVertex* sv =
static_cast<SubVertex*
>(e->subvertex);
1778 if (sv->b_next_subvertex == b) { sv->b_next_subvertex = a; }
1779 if (sv->b_previous_subvertex == b) { sv->b_previous_subvertex = a; }
1780 if (e->pair->subvertex == b) { e->pair->subvertex = a; }
1783 }
while (e != e_end);
1786 b->b_next_subvertex = b->b_previous_subvertex = 0;
1787 b->b_subvertex.dim = -1;
1790 if (a->g_subvertex.dim > b->g_subvertex.dim) {
1791 if (a->g_subvertex.dim == 1) {
1792 if (a->g_subvertex.e->subvertex == a) {
1793 if (a->g_subvertex.e < a->g_subvertex.e->pair) {
1794 a->g_subvertex.e->subvertex =
1795 a->g_next_subvertex == b ? a : a->g_next_subvertex;
1797 a->g_subvertex.e->subvertex =
1798 a->g_previous_subvertex == b ? a : a->g_previous_subvertex;
1801 if (a->g_subvertex.e->pair->subvertex == a) {
1802 if (a->g_subvertex.e->pair < a->g_subvertex.e) {
1803 a->g_subvertex.e->pair->subvertex =
1804 a->g_next_subvertex == b ? a : a->g_next_subvertex;
1806 a->g_subvertex.e->pair->subvertex =
1807 a->g_previous_subvertex == b ? a : a->g_previous_subvertex;
1811 if (a->g_previous_subvertex) {
1812 a->g_previous_subvertex->g_next_subvertex = a->g_next_subvertex;
1814 if (a->g_next_subvertex) {
1815 a->g_next_subvertex->g_previous_subvertex = a->g_previous_subvertex;
1817 if (b->g_subvertex.dim == 0) {
1818 if (b->g_subvertex.v->subvertex == b) { b->g_subvertex.v->subvertex = a; }
1819 g_edge_type* e = b->g_subvertex.v->edge;
1820 g_edge_type* e_end = e;
1823 SubVertex* sv =
static_cast<SubVertex*
>(e->subvertex);
1824 if (sv->g_next_subvertex == b) { sv->g_next_subvertex = a; }
1825 if (sv->g_previous_subvertex == b) { sv->g_previous_subvertex = a; }
1826 if (e->pair->subvertex == b) { e->pair->subvertex = a; }
1829 }
while (e != e_end);
1830 }
else if (b->g_subvertex.dim == 1) {
1831 if (b->g_subvertex.e->subvertex == b) { b->g_subvertex.e->subvertex = a; }
1832 if (b->g_subvertex.e->pair->subvertex == b) {
1833 b->g_subvertex.e->pair->subvertex = a;
1836 if (b->g_previous_subvertex && b->g_previous_subvertex->g_next_subvertex == b) {
1837 b->g_previous_subvertex->g_next_subvertex = a;
1839 if (b->g_next_subvertex && b->g_next_subvertex->g_previous_subvertex == b) {
1840 b->g_next_subvertex->g_previous_subvertex = a;
1842 std::swap(a->g_subvertex, b->g_subvertex);
1844 if (b->g_subvertex.dim == 1) {
1845 if (b->g_subvertex.e->subvertex == b) {
1846 if (b->g_subvertex.e < b->g_subvertex.e->pair) {
1847 b->g_subvertex.e->subvertex = b->g_next_subvertex;
1849 b->g_subvertex.e->subvertex = b->g_previous_subvertex;
1852 if (b->g_subvertex.e->pair->subvertex == b) {
1853 if (b->g_subvertex.e->pair < b->g_subvertex.e) {
1854 b->g_subvertex.e->pair->subvertex = b->g_next_subvertex;
1856 b->g_subvertex.e->pair->subvertex = b->g_previous_subvertex;
1860 if (b->g_previous_subvertex) {
1861 b->g_previous_subvertex->g_next_subvertex = b->g_next_subvertex;
1863 if (b->g_next_subvertex) {
1864 b->g_next_subvertex->g_previous_subvertex = b->g_previous_subvertex;
1866 if (b->g_subvertex.dim == 0) {
1867 if (b->g_subvertex.v->subvertex == b) { b->g_subvertex.v->subvertex = a; }
1868 g_edge_type* e = b->g_subvertex.v->edge;
1869 g_edge_type* e_end = e;
1872 SubVertex* sv =
static_cast<SubVertex*
>(e->subvertex);
1873 if (sv->g_next_subvertex == b) { sv->g_next_subvertex = a; }
1874 if (sv->g_previous_subvertex == b) { sv->g_previous_subvertex = a; }
1875 if (e->pair->subvertex == b) { e->pair->subvertex = a; }
1878 }
while (e != e_end);
1881 b->g_next_subvertex = b->g_previous_subvertex = 0;
1882 b->g_subvertex.dim = -1;
1893 bool try_g_vertice_on_blue_face(
1894 b_face_type* bf, std::vector<void*> list_b_cell, g_edge_type* ge) {
1896 std::stack<g_edge_type*> stack;
1899 while (!stack.empty()) {
1902 if (ge->vertex->subvertex) {
continue; }
1905 if (g_point_to_b_face(*ge->vertex, *bf, bsv, dist)) {
1907 SubVertex& rsv = new_sub_vertex();
1908 rsv.b_subvertex = bsv;
1909 rsv.g_subvertex.dim = 0;
1910 rsv.g_subvertex.v = ge->vertex;
1911 ge->vertex->subvertex = &rsv;
1916 for (g_edge_type* e = ge->next; e->pair != ge; e = e->pair->next) {
1917 if (e->vertex->subvertex == 0) { stack.push(e); }
1925 bool intersect_triangle(
1926 const double orig[3],
const double dir[3],
const double vert0[3],
const double vert1[3],
1927 const double vert2[3],
double& u,
double& v,
double& t,
double tol = -1) {
1928 if (tol < 0) { tol = tolerancing; }
1929 double edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
1930 double det, inv_det;
1932 sub_3(vert1, vert0, edge1);
1933 sub_3(vert2, vert0, edge2);
1937 det =
dot_3(edge1, pvec);
1939 if (det < epsilon) {
return false; }
1941 sub_3(orig, vert0, tvec);
1943 *u =
dot_3(tvec, pvec);
1944 if (*u < -epsilon || *u > det + epsilon) {
return false; }
1947 *v =
dot_3(dir, qvec);
1948 if (*v < -epsilon || *u + *v > det + epsilon) {
return false; }
1950 *t =
dot_3(edge2, qvec);
1951 inv_det = 1.0 / det;
1956 if (det > -tol && det < tol) {
return false; }
1957 inv_det = 1.0 / det;
1959 sub_3(orig, vert0, tvec);
1961 u =
dot_3(tvec, pvec) * inv_det;
1962 if (u < -tol || u > 1.0 + tol) {
return false; }
1966 v =
dot_3(dir, qvec) * inv_det;
1967 if (v < -tol || u + v > 1.0 + tol) {
return false; }
1969 t =
dot_3(edge2, qvec) * inv_det;
1974 bool g_point_to_b_face(
1975 g_vertex_type& g_vertex, b_face_type& face, BSubVertex& bsv,
double& dist) {
1976 const double tolerancing = this->tolerancing * 0.01;
1977 const b_edge_type* vert0 = face.edge;
1978 const b_edge_type* vert1 = vert0->next;
1979 const b_edge_type* vert2 = vert1->next;
1980 if (!intersect_triangle(
1981 g_vertex.coor, g_vertex.normal, vert0->vertex->coor, vert1->vertex->coor,
1982 vert2->vertex->coor, bsv.icoor[0], bsv.icoor[1], dist, tolerancing)) {
1986 const double x[3] = {bsv.icoor[0], bsv.icoor[1], 1 - x[0] - x[1]};
2012 if (x[0] > tolerancing && x[1] > tolerancing && x[2] > tolerancing) {
2017 b_edge_type* e = face.edge;
2018 if (x[0] < tolerancing) {
2019 if (x[1] > tolerancing && x[2] > tolerancing) {
2022 bsv.icoor[0] = 1 - x[1];
2024 }
else if (x[1] < tolerancing) {
2031 if (x[1] < tolerancing) {
2032 if (x[2] < tolerancing) {
2039 bsv.icoor[0] = x[0];
2044 assert(x[2] < tolerancing);
2046 if (x[0] < tolerancing) {
2052 bsv.icoor[0] = x[1];
2058 struct SystemSolveBVertexToGFaceProjection {
2059 typedef double value_type;
2061 static const int size = 3;
2063 void value(
const double x[3],
double y[3],
double jacobien[9])
const {
2064 for (
int i = 0; i != 3; ++i) {
2065 const double a1 = gp[0][i] - x[2] * gn[0][i];
2066 const double a2 = gp[1][i] - x[2] * gn[1][i];
2067 const double a3 = gp[2][i] - x[2] * gn[2][i];
2068 const double b = 1 - x[0] - x[1];
2069 y[i] = -bp[i] + b * a1 + x[0] * a2 + x[1] * a3;
2070 jacobien[i] = a2 - a1;
2071 jacobien[i + 3] = a3 - a1;
2072 jacobien[i + 6] = -b * gn[0][i] - x[0] * gn[1][i] - x[1] * gn[2][i];
2080 bool b_point_to_g_face(
2081 b_vertex_type& b_vertex, g_face_type& face, GSubVertex& gsv,
double& dist) {
2082 SystemSolveBVertexToGFaceProjection sys;
2083 std::copy(b_vertex.coor, b_vertex.coor + 3, sys.bp);
2084 g_edge_type* e = face.edge;
2085 for (
int i = 0; i != 3; ++i) {
2086 const g_vertex_type* v = e->vertex;
2087 std::copy(v->coor, v->coor + 3, sys.gp[i]);
2088 std::copy(v->normal, v->normal + 3, sys.gn[i]);
2092 if (!solve_newton_raphson(sys, x)) {
return false; }
2094 x[2] = 1 - x[0] - x[1];
2095 if (x[0] < -tolerancing || x[1] < -tolerancing || x[2] < -tolerancing) {
return false; }
2096 if (x[0] > tolerancing && x[1] > tolerancing && x[2] > tolerancing) {
2099 gsv.icoor[0] = x[0];
2100 gsv.icoor[1] = x[1];
2104 if (x[0] < tolerancing) {
2105 if (x[1] > tolerancing && x[2] > tolerancing) {
2108 gsv.icoor[0] = 1 - x[1];
2110 }
else if (x[1] < tolerancing) {
2117 if (x[1] < tolerancing) {
2118 if (x[2] < tolerancing) {
2125 gsv.icoor[0] = x[0];
2130 assert(x[2] < tolerancing);
2132 if (x[0] < tolerancing) {
2138 gsv.icoor[0] = x[1];
2144 bool edge_intersection(
2145 b_edge_type& b_edge, g_edge_type& g_edge, SubVertex& sv,
double& alpha,
double& beta) {
2146 typedef long double T;
2147 const g_vertex_type& g_vertex0 = *g_edge.pair->vertex;
2148 const double* g0 = g_vertex0.coor;
2149 const double* d0 = g_vertex0.normal;
2150 const g_vertex_type& g_vertex1 = *g_edge.vertex;
2151 const double* g1 = g_vertex1.coor;
2152 const double* d1 = g_vertex1.normal;
2153 const double* b0 = b_edge.pair->vertex->coor;
2154 const double* b1 = b_edge.vertex->coor;
2157 sub_3(b1, b0, b1_b0);
2159 sub_3(d1, d0, d1_d0);
2161 sub_3(g1, g0, g1_g0);
2162 T b1_b0_cross_d1_d0[3];
2164 const T c2 =
dot_3(b1_b0_cross_d1_d0, g1_g0);
2165 T b1_b0_cross_d0[3];
2168 sub_3(g0, b0, g0_b0);
2169 const T c1 =
dot_3(b1_b0_cross_d0, g1_g0) +
dot_3(b1_b0_cross_d1_d0, g0_b0);
2170 const T c0 =
dot_3(b1_b0_cross_d0, g0_b0);
2174 if (std::abs(c2) > epsilon) {
2175 T delta = c1 * c1 - 4 * c0 * c2;
2176 if (delta < -epsilon) {
2177 alpha = beta = std::numeric_limits<double>::quiet_NaN();
2180 }
else if (delta < epsilon) {
2183 delta = std::sqrt(delta);
2184 T beta1 = (-c1 - delta) / (2 * c2);
2185 T beta2 = (-c1 + delta) / (2 * c2);
2186 if (beta1 < -tolerancing || beta1 > 1.0 + tolerancing) {
2189 }
else if (beta2 < -tolerancing || beta2 > 1.0 + tolerancing) {
2197 }
else if (std::abs(c1) > epsilon) {
2199 l_beta[0] = -c0 / c1;
2209 bool l_alpha_nan[2];
2210 for (
int j = 0; j != nb_beta; ++j) {
2212 for (
int i = 0; i != 3; ++i) { d0_beta_d1_d0[i] = d0[i] + l_beta[j] * d1_d0[i]; }
2215 const T l_b1_b0 =
dot_3(l, b1_b0);
2216 if (std::abs(l_b1_b0) < epsilon) {
2217 l_alpha_nan[j] =
true;
2219 l_alpha_nan[j] =
false;
2220 l_alpha[j] =
dot_3(l, g0_b0) / l_b1_b0;
2226 if (l_alpha_nan[0] || l_alpha_nan[1]) {
2227 if (l_alpha_nan[0] && l_alpha_nan[1]) {
return false; }
2228 i = l_alpha_nan[0] ? 1 : 0;
2229 }
else if (l_alpha[0] > l_alpha[1]) {
2230 if (l_alpha[1] > -tolerancing) {
2235 }
else if (l_alpha[0] > -tolerancing) {
2244 if (l_alpha_nan[0]) {
return false; }
2248 if (alpha < tolerancing) {
2249 if (alpha > -tolerancing) {
2250 sv.b_subvertex.dim = 0;
2252 sv.b_subvertex.v = b_edge.pair->vertex;
2254 b_edge_type* e = &b_edge;
2255 while (e->next != &b_edge) { e = e->next; }
2256 sv.b_subvertex.v = e->vertex;
2261 }
else if (alpha > 1.0 - tolerancing) {
2262 if (alpha < 1.0 + tolerancing) {
2263 sv.b_subvertex.dim = 0;
2264 sv.b_subvertex.v = b_edge.vertex;
2269 sv.b_subvertex.dim = 1;
2270 sv.b_subvertex.e = &b_edge;
2271 sv.b_subvertex.icoor[0] = alpha;
2274 if (beta < tolerancing) {
2275 if (beta > -tolerancing) {
2276 sv.g_subvertex.dim = 0;
2277 sv.g_subvertex.v = g_edge.pair->vertex;
2281 }
else if (beta > 1.0 - tolerancing) {
2282 if (beta < 1.0 + tolerancing) {
2283 sv.g_subvertex.dim = 0;
2284 sv.g_subvertex.v = g_edge.vertex;
2289 sv.g_subvertex.dim = 1;
2290 sv.g_subvertex.e = &g_edge;
2291 sv.g_subvertex.icoor[0] = beta;
2302 std::pair<b_vertex_type*, GSubVertex> green_parent_of_a_blue_vertex_by_brute_force() {
2303 typename B_DCEL_MESH::vertex_iterator bv = b_mesh->vertex_begin();
2304 g_face_type* g_face = 0;
2305 std::pair<b_vertex_type*, GSubVertex> res;
2306 while (g_face == 0 && bv != b_mesh->vertex_end()) {
2307 double g_face_dist = 1e100;
2308 for (
typename G_DCEL_MESH::face_iterator gf = g_mesh->face_begin();
2309 gf != g_mesh->face_end(); ++gf) {
2312 if (b_point_to_g_face(*bv, *gf, gsv, dist)) {
2313 if (std::abs(dist) < g_face_dist) {
2315 g_face_dist = std::abs(dist);
2324 res.first = &*b_mesh->vertex_begin();
2327 std::fill_n(res.second.icoor, 2, 0);
2332 B_DCEL_MESH* b_mesh;
2333 G_DCEL_MESH* g_mesh;
2336 b_edge_type* b_border_edge;
2338 SubVertex& new_sub_vertex() {
2339 list_subvertex.push_back(SubVertex());
2340 SubVertex& res = list_subvertex.back();
2341 res.b_next_subvertex = 0;
2342 res.b_previous_subvertex = 0;
2343 res.g_next_subvertex = 0;
2344 res.g_previous_subvertex = 0;
2348 size_t get_subvertex_id(
const void* sv)
const {
2349 for (
size_t i = 0; i != list_subvertex.size(); ++i) {
2350 if (&list_subvertex[i] == sv) {
return i; }
2352 assert(sv ==
nullptr);
2353 return 11111111111111;
2356 typedef std::deque<SubVertex> list_subvertex_t;
2357 list_subvertex_t list_subvertex;