diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2015-04-01 02:13:16 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2015-04-01 02:13:16 +0000 |
| commit | dff3aa428ff050c2cce501f646977ddad921feca (patch) | |
| tree | 3152c9b571095e1db57af2522129d278b5f4ce39 /src/2geom/pointwise.cpp | |
| parent | removed code comments (diff) | |
| download | inkscape-dff3aa428ff050c2cce501f646977ddad921feca.tar.gz inkscape-dff3aa428ff050c2cce501f646977ddad921feca.zip | |
Move 2Geom work to a intermediate positon -helper-
Removed dependency to helper/geom.h
Now use a simple vector, not a vector of pairs of size_t and Satellite
Getters and setters on Satellite removed
Update store parameter to a more friendly string, like powerstroke
Todo:
Documentation and Fix coding style.
(bzr r13645.1.63)
Diffstat (limited to 'src/2geom/pointwise.cpp')
| -rw-r--r-- | src/2geom/pointwise.cpp | 519 |
1 files changed, 0 insertions, 519 deletions
diff --git a/src/2geom/pointwise.cpp b/src/2geom/pointwise.cpp deleted file mode 100644 index bc82780d7..000000000 --- a/src/2geom/pointwise.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/* - * pointwise.cpp - * Authors: - * 2015 Jabier Arraiza Cenoz<jabier.arraiza@marker.es> - * Copyright 2015 authors - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, output to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - */ - -#include <2geom/pointwise.h> -#include <2geom/ray.h> -#include <2geom/path-intersection.h> -#include <cmath> - -namespace Geom { - -Pointwise::Pointwise(Piecewise<D2<SBasis> > pwd2, std::vector<std::pair<size_t,Satellite> > satellites) - : _pwd2(pwd2),_satellites(satellites),_pathInfo() -{ - setPathInfo(); -}; - -Pointwise::~Pointwise(){}; - -Piecewise<D2<SBasis> > -Pointwise::getPwd2() const -{ - return _pwd2; -} - -void -Pointwise::setPwd2(Piecewise<D2<SBasis> > pwd2_in) -{ - _pwd2 = pwd2_in; - setPathInfo(); -} - -std::vector<std::pair<size_t,Satellite> > -Pointwise::getSatellites() const -{ - return _satellites; -} - -void -Pointwise::setSatellites(std::vector<std::pair<size_t,Satellite> > sats) -{ - _satellites = sats; -} - -//START QUESTION Next functions maybe is beter land outside the class? -void -Pointwise::setPathInfo() -{ - setPathInfo(_pwd2); -} - -void -Pointwise::setPathInfo(Piecewise<D2<SBasis> > pwd2) -{ - _pathInfo.clear(); - std::vector<Geom::Path> path_in = path_from_piecewise(remove_short_cuts(pwd2,0.1), 0.001); - size_t counter = 0; - 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(); - if (path_it->closed()) { - 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) { - ++curve_it1; - counter++; - } - if(path_it->closed()){ - _pathInfo.push_back(std::make_pair(counter-1,true)); - } else { - _pathInfo.push_back(std::make_pair(counter-1,false)); - } - } -} - -size_t -Pointwise::getSubPathIndex(size_t index) const -{ - for(size_t i = 0; i < _pathInfo.size(); i++){ - if(index <= _pathInfo[i].first){ - return i; - } - } - return 0; -} - -size_t -Pointwise::getLast(size_t index) const -{ - for(size_t i = 0; i < _pathInfo.size(); i++){ - if(index <= _pathInfo[i].first){ - return _pathInfo[i].first; - } - } - return 0; -} - -size_t -Pointwise::getFirst(size_t index) const -{ - for(size_t i = 0; i < _pathInfo.size(); i++){ - if(index <= _pathInfo[i].first){ - if(i==0){ - return 0; - } else { - return _pathInfo[i-1].first + 1; - } - } - } - return 0; -} - -boost::optional<size_t> -Pointwise::getPrevious(size_t index) const -{ - if(getFirst(index) == index && getIsClosed(index)){ - return getLast(index); - } - if(getFirst(index) == index && !getIsClosed(index)){ - return boost::none; - } - return index - 1; -} - -boost::optional<size_t> -Pointwise::getNext(size_t index) const -{ - if(getLast(index) == index && getIsClosed(index)){ - return getFirst(index); - } - if(getLast(index) == index && !getIsClosed(index)){ - return boost::none; - } - return index + 1; -} - -bool -Pointwise::getIsClosed(size_t index) const -{ - for(size_t i = 0; i < _pathInfo.size(); i++){ - if(index <= _pathInfo[i].first){ - return _pathInfo[i].second; - } - } - return false; -} -//END QUESTION - -void -Pointwise::recalculate_for_new_pwd2(Piecewise<D2<SBasis> > A) -{ - if( _pwd2.size() > A.size()){ - pwd2_sustract(A); - } else if (_pwd2.size() < A.size()){ - pwd2_append(A); - } -} - -void -Pointwise::pwd2_append(Piecewise<D2<SBasis> > A) -{ - size_t counter = 0; - std::vector<std::pair<size_t,Satellite> > sats; - 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++){ - 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; - bool hidden = false; - bool isTime = _satellites[0].second.getIsTime(); - bool mirror_knots = _satellites[0].second.getHasMirror(); - double amount = 0.0; - double degrees = 0.0; - int steps = 0; - Satellite sat(_satellites[0].second.getSatelliteType(), isTime, isEndOpen, active, mirror_knots, hidden, amount, degrees, steps); - sats.push_back(std::make_pair(i,sat)); - } else { - 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); -} - -void -Pointwise::pwd2_sustract(Piecewise<D2<SBasis> > A) -{ - size_t counter = 0; - std::vector<std::pair<size_t,Satellite> > sats; - 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; - setPwd2(A); - for(size_t i = 0; i < _satellites.size(); i++){ - 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 { - 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 active, bool hidden, double amount, double angle) -{ - for(size_t i = 0; i < _pathInfo.size(); i++){ - size_t firstNode = getFirst(_pathInfo[i].first); - size_t lastNode = getLast(_pathInfo[i].first); - if(!getIsClosed(lastNode)){ - long lastIndex = -1; - for(size_t j = 0; j < _satellites.size(); j++){ - if(_satellites[j].first < firstNode || _satellites[j].first > lastNode){ - continue; - } - _satellites[j].second.setIsEndOpen(false); - if(_satellites[j].first == firstNode){ - _satellites[j].second.setActive(active); - _satellites[j].second.setHidden(hidden); - if(amount >= 0){ - _satellites[j].second.setAmount(amount); - } - if(angle >= 0){ - _satellites[j].second.setAngle(angle); - } - } - if(_satellites[j].first == lastNode && lastIndex == -1){ - lastIndex = j; - } - } - 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){ - 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 -Pointwise::rad_to_len(double A, std::pair<size_t,Geom::Satellite> sat) const -{ - double len = 0; - boost::optional<size_t> d2_prev_index = getPrevious(sat.first); - if(d2_prev_index){ - Geom::D2<Geom::SBasis> d2_in = _pwd2[*d2_prev_index]; - Geom::D2<Geom::SBasis> d2_out = _pwd2[sat.first]; - Piecewise<D2<SBasis> > offset_curve0 = Piecewise<D2<SBasis> >(d2_in)+rot90(unitVector(derivative(d2_in)))*(A); - Piecewise<D2<SBasis> > offset_curve1 = Piecewise<D2<SBasis> >(d2_out)+rot90(unitVector(derivative(d2_out)))*(A); - Geom::Path p0 = path_from_piecewise(offset_curve0, 0.1)[0]; - Geom::Path p1 = path_from_piecewise(offset_curve1, 0.1)[0]; - Geom::Crossings cs = Geom::crossings(p0, p1); - if(cs.size() > 0){ - Point cp =p0(cs[0].ta); - double p0pt = nearest_point(cp, d2_out); - len = sat.second.toSize(p0pt,d2_out); - } else { - if(A > 0){ - len = rad_to_len(A * -1, sat); - } - } - } - return len; -} - -double -Pointwise::len_to_rad(double A, std::pair<size_t,Geom::Satellite> sat) const -{ - boost::optional<size_t> d2_prev_index = getPrevious(sat.first); - if(d2_prev_index){ - Geom::D2<Geom::SBasis> d2_in = _pwd2[*d2_prev_index]; - Geom::D2<Geom::SBasis> d2_out = _pwd2[sat.first]; - double time_in = sat.second.getOpositeTime(A, d2_in); - double time_out = sat.second.toTime(A,d2_out); - Geom::Point startArcPoint = (d2_in).valueAt(time_in); - Geom::Point endArcPoint = d2_out.valueAt(time_out); - Piecewise<D2<SBasis> > u; - u.push_cut(0); - u.push((d2_in), 1); - Geom::Curve * A = path_from_piecewise(u, 0.1)[0][0].duplicate(); - Piecewise<D2<SBasis> > u2; - u2.push_cut(0); - u2.push((d2_out), 1); - Geom::Curve * B = path_from_piecewise(u2, 0.1)[0][0].duplicate(); - Curve *knotCurve1 = A->portion(0, time_in); - Curve *knotCurve2 = B->portion(time_out, 1); - Geom::CubicBezier const *cubic1 = dynamic_cast<Geom::CubicBezier const *>(&*knotCurve1); - Ray ray1(startArcPoint, (d2_in).valueAt(1)); - if (cubic1) { - ray1.setPoints((*cubic1)[2], startArcPoint); - } - Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(&*knotCurve2); - Ray ray2(d2_out.valueAt(0), endArcPoint); - if (cubic2) { - ray2.setPoints(endArcPoint, (*cubic2)[1]); - } - bool ccwToggle = cross((d2_in).valueAt(1) - startArcPoint, endArcPoint - startArcPoint) < 0; - double distanceArc = Geom::distance(startArcPoint,middle_point(startArcPoint,endArcPoint)); - double angleBetween = angle_between(ray1, ray2, ccwToggle); - double divisor = std::sin(angleBetween/2.0); - if(divisor > 0){ - return distanceArc/divisor; - } - } - 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 -{ - std::vector<size_t> ret; - long counter = 0; - for(size_t i = 0; i < _satellites.size(); i++){ - if(_satellites[i].first == A){ - if(counter >= B && B != (long)-1){ - return ret; - } - ret.push_back(i); - counter++; - } - } - return ret; -} - -std::vector<size_t > -Pointwise::findPeviousSatellites(size_t A, long B) const -{ - boost::optional<size_t> previous = getPrevious(A); - std::vector<size_t> ret; - if(previous){ - ret = findSatellites(*previous,B); - } - return ret; -} - -} -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
