void CCurve::FitArcs() { std::list<CVertex> new_vertices; std::list<const CVertex*> might_be_an_arc; CArc arc; bool arc_found = false; bool arc_added = false; int i = 0; for(std::list<CVertex>::iterator It = m_vertices.begin(); It != m_vertices.end(); It++, i++) { CVertex& vt = *It; if(vt.m_type || i == 0) new_vertices.push_back(vt); else { might_be_an_arc.push_back(&vt); if(might_be_an_arc.size() == 1) { } else { AddArcOrLines(true, new_vertices, might_be_an_arc, arc, arc_found, arc_added); } } } if(might_be_an_arc.size() > 0)AddArcOrLines(false, new_vertices, might_be_an_arc, arc, arc_found, arc_added); if(arc_added) { m_vertices.clear(); for(std::list<CVertex>::iterator It = new_vertices.begin(); It != new_vertices.end(); It++)m_vertices.push_back(*It); for(std::list<const CVertex*>::iterator It = might_be_an_arc.begin(); It != might_be_an_arc.end(); It++)m_vertices.push_back(*(*It)); } }
void CCurve::FitArcs(bool retry) { std::list<CVertex> new_vertices; std::list<const CVertex*> might_be_an_arc; CArc arc; bool arc_found = false; bool arc_added = false; int i = 0; for(std::list<CVertex>::iterator It = m_vertices.begin(); It != m_vertices.end(); It++, i++) { CVertex& vt = *It; if(vt.m_type || i == 0) { if (i != 0) { AddArcOrLines(false, new_vertices, might_be_an_arc, arc, arc_found, arc_added); } new_vertices.push_back(vt); } else { might_be_an_arc.push_back(&vt); if(might_be_an_arc.size() == 1) { } else { AddArcOrLines(true, new_vertices, might_be_an_arc, arc, arc_found, arc_added); } } } if(might_be_an_arc.size() > 0) { // check if the last edge can form an arc with the starting edge if(!retry && !arc_found && m_vertices.size()>2 && m_vertices.begin()->m_type==0 && IsClosed()) { std::list<const CVertex*> tmp; auto it = m_vertices.begin(); tmp.push_back(&(*it++)); tmp.push_back(&(*it)); CArc tmpArc; if(CheckForArc(new_vertices.back(),tmp,tmpArc)) { m_vertices.push_front(CVertex(new_vertices.back().m_p)); m_vertices.pop_back(); FitArcs(true); return; } } AddArcOrLines(false, new_vertices, might_be_an_arc, arc, arc_found, arc_added); } if(arc_added) { m_vertices.clear(); for(std::list<CVertex>::iterator It = new_vertices.begin(); It != new_vertices.end(); It++)m_vertices.push_back(*It); for(std::list<const CVertex*>::iterator It = might_be_an_arc.begin(); It != might_be_an_arc.end(); It++)m_vertices.push_back(*(*It)); } }