diff options
Diffstat (limited to 'src/2geom/pointwise.cpp')
| -rw-r--r-- | src/2geom/pointwise.cpp | 174 |
1 files changed, 145 insertions, 29 deletions
diff --git a/src/2geom/pointwise.cpp b/src/2geom/pointwise.cpp index b97f8749f..bc82780d7 100644 --- a/src/2geom/pointwise.cpp +++ b/src/2geom/pointwise.cpp @@ -183,13 +183,10 @@ void Pointwise::recalculate_for_new_pwd2(Piecewise<D2<SBasis> > A) { if( _pwd2.size() > A.size()){ - std::cout << "bbbbbbbbbbbbbbbbbbbbbbbbb\n"; pwd2_sustract(A); - } else if ( _pwd2.size() < A.size()){ + } else if (_pwd2.size() < A.size()){ pwd2_append(A); - std::cout << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"; } - std::cout << "cccccccccccccccccccccccccccccccccc\n"; } void @@ -197,14 +194,39 @@ Pointwise::pwd2_append(Piecewise<D2<SBasis> > A) { size_t counter = 0; std::vector<std::pair<size_t,Satellite> > sats; - Piecewise<D2<SBasis> > pwd2 = _pwd2; - setPwd2(A); - std::cout << A.size() << "ASIZE\n"; - std::cout << pwd2.size() << "PWD2SIZE\n"; + for (std::vector<std::pair<size_t,Satellite> >::iterator it=_satellites.begin(); it!=_satellites.end();) + { + if(it->second.getIsEndOpen()){ + it = _satellites.erase(it); + } else { + ++it; + } + } + bool reversed = false; + bool reorder = false; for(size_t i = 0; i < A.size(); i++){ - std::cout << i << "indes\n"; - std::cout << counter << "counter\n"; - if(pwd2.size() <= i-counter || !are_near(pwd2[i-counter].at0(),A[i].at0(),0.001)){ + size_t first = getFirst(i-counter); + size_t last = getLast(i-counter); + setPathInfo(A); + size_t subpathAIndex = getSubPathIndex(i); + setPathInfo(_pwd2); + bool changedSubpath = false; + if(_pwd2.size() <= i-counter){ + changedSubpath = false; + } else { + changedSubpath = subpathAIndex != getSubPathIndex(i-counter); + } + if(!reorder && first == i-counter && !are_near(_pwd2[i-counter].at0(),A[i].at0(),0.001) && !changedSubpath){ + subpath_append_reorder(getSubPathIndex(first)); + reorder = true; + i--; + continue; + } + if(!reversed && first == i-counter && !are_near(_pwd2[i-counter].at0(),A[i].at0(),0.001) && !changedSubpath){ + reverse(first, last); + reversed = true; + } + if(_pwd2.size() <= i-counter || !are_near(_pwd2[i-counter].at0(),A[i].at0(),0.001)){ counter++; bool isEndOpen = false; bool active = true; @@ -217,9 +239,13 @@ Pointwise::pwd2_append(Piecewise<D2<SBasis> > A) Satellite sat(_satellites[0].second.getSatelliteType(), isTime, isEndOpen, active, mirror_knots, hidden, amount, degrees, steps); sats.push_back(std::make_pair(i,sat)); } else { - sats.push_back(std::make_pair(i,_satellites[i-counter].second)); + std::vector<size_t> satsFind = findSatellites(i-counter,999); + for(size_t j = 0; j< satsFind.size(); j++){ + sats.push_back(std::make_pair(i,_satellites[satsFind[j]].second)); + } } } + setPwd2(A); setSatellites(sats); } @@ -228,9 +254,12 @@ Pointwise::pwd2_sustract(Piecewise<D2<SBasis> > A) { size_t counter = 0; std::vector<std::pair<size_t,Satellite> > sats; - for(size_t i = 0; i < _satellites.size(); i++){ - if(_satellites[i].second.getIsEndOpen()){ - _satellites.erase(_satellites.begin() + i); + for (std::vector<std::pair<size_t,Satellite> >::iterator it=_satellites.begin(); it!=_satellites.end();) + { + if(it->second.getIsEndOpen()){ + it = _satellites.erase(it); + } else { + ++it; } } Piecewise<D2<SBasis> > pwd2 = _pwd2; @@ -239,14 +268,17 @@ Pointwise::pwd2_sustract(Piecewise<D2<SBasis> > A) if(getLast(_satellites[i].first-counter) < _satellites[i].first-counter || !are_near(pwd2[_satellites[i].first].at0(),A[_satellites[i].first-counter].at0(),0.001)){ counter++; } else { - sats.push_back(std::make_pair(_satellites[i].first-counter,_satellites[i].second)); + std::vector<size_t> satsFind = findSatellites(_satellites[i].first-counter,999); + for(size_t j = 0; j< satsFind.size(); j++){ + sats.push_back(std::make_pair(_satellites[i].first-counter,_satellites[satsFind[j]].second)); + } } } setSatellites(sats); } void -Pointwise::set_extremes(bool endOpenSat,bool active, bool hidden, double amount, double angle) +Pointwise::set_extremes(bool active, bool hidden, double amount, double angle) { for(size_t i = 0; i < _pathInfo.size(); i++){ size_t firstNode = getFirst(_pathInfo[i].first); @@ -268,30 +300,96 @@ Pointwise::set_extremes(bool endOpenSat,bool active, bool hidden, double amount, _satellites[j].second.setAngle(angle); } } - - if(_satellites[j].first == lastNode && lastIndex != -1){ - _satellites[j].second.setIsEndOpen(true); - } - if(_satellites[j].first == lastNode && lastIndex == -1){ lastIndex = j; } } - if(endOpenSat){ - Satellite sat(_satellites[0].second.getSatelliteType(), _satellites[0].second.getIsTime(), true, active, _satellites[0].second.getHasMirror(), hidden, 0.0, 0.0, _satellites[0].second.getSteps()); - _satellites.insert(_satellites.begin() + lastIndex + 1, std::make_pair(lastNode,sat)); + Satellite sat(_satellites[0].second.getSatelliteType(), _satellites[0].second.getIsTime(), true, active, _satellites[0].second.getHasMirror(), hidden, 0.0, 0.0, _satellites[0].second.getSteps()); + _satellites.insert(_satellites.begin() + lastIndex + 1, std::make_pair(lastNode,sat)); + } else { + for(size_t j = 0; j < _satellites.size(); j++){ + if(_satellites[j].first < firstNode){ + continue; + } + if(_satellites[j].first == firstNode && !_satellites[j].second.getActive()){ + _satellites[j].second.setActive(true); + _satellites[j].second.setHidden(_satellites[j+1].second.getHidden()); + } + + } + } + } +} + +void +Pointwise::subpath_append_reorder(size_t subpath){ + std::vector<Geom::Path> path_in = path_from_piecewise(remove_short_cuts(_pwd2,0.1), 0.001); + size_t nSubpath = 0; + size_t counter = 0; + std::vector<Geom::Path> tmp_path; + Geom::Path rev; + for (PathVector::const_iterator path_it = path_in.begin(); path_it != path_in.end(); ++path_it) { + if (path_it->empty()){ + continue; + } + Geom::Path::const_iterator curve_it1 = path_it->begin(); + Geom::Path::const_iterator curve_endit = path_it->end_default(); + const Curve &closingline = path_it->back_closed(); + if (are_near(closingline.initialPoint(), closingline.finalPoint())) { + curve_endit = path_it->end_open(); + } + while (curve_it1 != curve_endit) { + if(nSubpath == subpath){ + std::vector<size_t> sats = findSatellites(counter,999); + for(size_t i = 0; i< sats.size(); i++){ + _satellites.push_back(std::make_pair(_pwd2.size(),_satellites[sats[i]].second)); + } + deleteSatellites(counter); + } else { + counter++; } + ++curve_it1; } + if(nSubpath == subpath){ + rev = *path_it; + } else { + tmp_path.push_back(*path_it); + } + nSubpath++; } + tmp_path.push_back(rev); + setPwd2(remove_short_cuts(paths_to_pw(pathv_to_linear_and_cubic_beziers(tmp_path)),0.01)); } void Pointwise::reverse(size_t start,size_t end){ - for(size_t i = start; i < end / 2; i++){ - std::pair<size_t,Satellite> tmp = _satellites[i]; - _satellites[i] = _satellites[end - start - i - 1]; - _satellites[end - start - i - 1] = tmp; + start ++; + for(size_t i = end; i >= start; i--){ + std::vector<size_t> sats = findSatellites(i,999); + for(size_t j = 0; j< sats.size(); j++){ + _satellites.push_back(std::make_pair(_pwd2.size(),_satellites[sats[j]].second)); + } + deleteSatellites(i); } + std::vector<Geom::Path> path_in = path_from_piecewise(remove_short_cuts(_pwd2,0.1), 0.001); + size_t counter = 0; + size_t nSubpath = 0; + size_t subpath = getSubPathIndex(start); + std::vector<Geom::Path> tmp_path; + Geom::Path rev; + for (PathVector::const_iterator path_it = path_in.begin(); path_it != path_in.end(); ++path_it) { + if (path_it->empty()){ + continue; + } + counter ++; + if(nSubpath == subpath){ + tmp_path.push_back(path_it->reverse()); + } else { + tmp_path.push_back(*path_it); + } + nSubpath++; + } + setPwd2(remove_short_cuts(paths_to_pw(pathv_to_linear_and_cubic_beziers(tmp_path)),0.01)); } double @@ -362,6 +460,24 @@ Pointwise::len_to_rad(double A, std::pair<size_t,Geom::Satellite> sat) const return 0; } +void +Pointwise::deleteSatellites(size_t A) +{ + bool erased = false; + for (std::vector<std::pair<size_t,Satellite> >::iterator it=_satellites.begin(); it!=_satellites.end();) + { + if(it->first == A){ + it = _satellites.erase(it); + erased = true; + } else { + if(erased){ + it->first = it->first-1; + } + ++it; + } + } +} + std::vector<size_t> Pointwise::findSatellites(size_t A, long B) const { |
