15 for(
size_t i=0;
i<nodes.size();++
i)
17 if(!nodes[
i]->isPeriodicSubdivision())
21 size_t previous=(
i+nodes.size()-1)%nodes.size();
22 size_t next=(
i+1)%nodes.size();
23 while(previous!=
i && (nodes[previous]->get_P()-nodes[
i]->get_P()).norm()<=tolerance)
25 previous=(previous+nodes.size()-1)%nodes.size();
27 while(next!=
i && (nodes[next]->get_P()-nodes[
i]->get_P()).norm()<=tolerance)
29 next=(next+1)%nodes.size();
31 const auto incoming=(nodes[
i]->get_P()-nodes[previous]->get_P()).eval();
32 const auto outgoing=(nodes[next]->get_P()-nodes[
i]->get_P()).eval();
33 if(previous!=
i && next!=
i &&
34 (incoming.dot(outgoing)<=0 ||
35 incoming.cross(outgoing).norm()>tolerance*(incoming.norm()+outgoing.norm())))
37 nodes[
i]->periodicContourVertex=
true;
54 for(
const auto& node : nodes)
56 if((node->get_P()-nodes[anchors.front()]->get_P()).norm()>tolerance)
67 for(
size_t path=0;path<2;++path)
69 const size_t begin=anchors[path];
70 const size_t end=anchors[1-path];
71 const auto origin=nodes[begin]->get_P();
72 const auto chord=(nodes[
end]->get_P()-origin).eval();
73 const double length=chord.norm();
75 for(
size_t i=(begin+1)%nodes.size();
i!=
end;
i=(
i+1)%nodes.size())
77 const auto offset=(nodes[
i]->get_P()-origin).eval();
80 if(offset.norm()>tolerance)
87 const double distance=offset.dot(chord)/length;
88 if(distance<previous-tolerance || distance>length+tolerance ||
89 (offset-distance*chord/length).norm()>tolerance)