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;