summaryrefslogtreecommitdiffstats
path: root/src/2geom/pointwise.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/2geom/pointwise.cpp')
-rw-r--r--src/2geom/pointwise.cpp174
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
{