336 std::vector<EFAFragment2D *> new_fragments;
337 std::vector<unsigned int> cut_edges;
338 std::vector<unsigned int> cut_nodes;
342 cut_nodes.push_back(iedge);
344 EFAError(
"A fragment boundary edge can't have more than 1 cuts");
346 cut_edges.push_back(iedge);
349 if (cut_edges.size() > 2)
351 EFAError(
"In split() fragment cannot have more than 2 cut edges");
353 else if (cut_edges.size() == 1 && cut_nodes.size() == 1)
355 if (cut_edges[0] == 1 && cut_nodes[0] == 0)
374 new_fragments.push_back(new_frag1);
375 new_fragments.push_back(new_frag2);
377 else if (cut_edges[0] == 2 && cut_nodes[0] == 0)
396 new_fragments.push_back(new_frag1);
397 new_fragments.push_back(new_frag2);
399 else if (cut_edges[0] == 2 && cut_nodes[0] == 1)
418 new_fragments.push_back(new_frag1);
419 new_fragments.push_back(new_frag2);
421 else if (cut_edges[0] == 3 && cut_nodes[0] == 1)
440 new_fragments.push_back(new_frag1);
441 new_fragments.push_back(new_frag2);
443 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
462 new_fragments.push_back(new_frag1);
463 new_fragments.push_back(new_frag2);
465 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
484 new_fragments.push_back(new_frag1);
485 new_fragments.push_back(new_frag2);
487 else if (cut_edges[0] == 3 && cut_nodes[0] == 2)
506 new_fragments.push_back(new_frag1);
507 new_fragments.push_back(new_frag2);
509 else if (cut_edges[0] == 1 && cut_nodes[0] == 3)
528 new_fragments.push_back(new_frag1);
529 new_fragments.push_back(new_frag2);
531 else if (cut_edges[0] == 0 && cut_nodes[0] == 3)
550 new_fragments.push_back(new_frag1);
551 new_fragments.push_back(new_frag2);
554 else if (cut_nodes.size() == 2)
556 if ((cut_nodes[0] == 0 && cut_nodes[1] == 2) || (cut_nodes[0] == 2 && cut_nodes[1] == 0))
573 new_fragments.push_back(new_frag1);
574 new_fragments.push_back(new_frag2);
576 else if ((cut_nodes[0] == 1 && cut_nodes[1] == 3) || (cut_nodes[0] == 3 && cut_nodes[1] == 1))
593 new_fragments.push_back(new_frag1);
594 new_fragments.push_back(new_frag2);
596 else if ((cut_nodes[0] == 0 && cut_nodes[1] == 1) || (cut_nodes[0] == 1 && cut_nodes[1] == 2) ||
597 (cut_nodes[0] == 2 && cut_nodes[1] == 3) || (cut_nodes[0] == 3 && cut_nodes[1] == 0) ||
598 (cut_nodes[0] == 1 && cut_nodes[1] == 0) || (cut_nodes[0] == 2 && cut_nodes[1] == 1) ||
599 (cut_nodes[0] == 3 && cut_nodes[1] == 2) || (cut_nodes[0] == 0 && cut_nodes[1] == 3))
612 new_fragments.push_back(new_frag);
615 else if (cut_edges.size() == 2 || (cut_edges.size() == 1 && cut_nodes.size() == 0))
617 unsigned int iedge = 0;
618 unsigned int icutedge = 0;
626 if (iedge == cut_edges[icutedge])
629 unsigned int iprevedge(iedge > 0 ? iedge - 1 :
_boundary_edges.size() - 1);
634 EFAError(
"Previous edge does not contain either of the nodes in this edge");
637 new_frag->
addEdge(
new EFAEdge(first_node_on_edge, embedded_node1));
640 if (icutedge == cut_edges.size())
642 iedge = cut_edges[icutedge];
644 if (embedded_node2 != embedded_node1)
648 unsigned int inextedge(iedge < (
_boundary_edges.size() - 1) ? iedge + 1 : 0);
653 EFAError(
"Next edge does not contain either of the nodes in this edge");
655 new_frag->
addEdge(
new EFAEdge(embedded_node2, second_node_on_edge));
665 if (cut_edges.size() > 1)
667 iedge = cut_edges[0] + 1;
672 new_fragments.push_back(new_frag);
673 }
while (new_fragments.size() < cut_edges.size());
675 else if (cut_nodes.size() == 1)
682 new_frag->
addEdge(
new EFAEdge(first_node_on_edge, second_node_on_edge));
684 new_fragments.push_back(new_frag);
687 return new_fragments;