diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2015-03-04 22:42:59 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2015-03-04 22:42:59 +0000 |
| commit | 1db09cce6114c1b2d95ac77b00672caad0447b29 (patch) | |
| tree | 8aa92d59737bc340b63bd73c368f856da0a46a51 /src/2geom/pointwise.cpp | |
| parent | update to trunk (diff) | |
| download | inkscape-1db09cce6114c1b2d95ac77b00672caad0447b29.tar.gz inkscape-1db09cce6114c1b2d95ac77b00672caad0447b29.zip | |
All features done, only need piecewise update function
(bzr r13645.1.33)
Diffstat (limited to 'src/2geom/pointwise.cpp')
| -rw-r--r-- | src/2geom/pointwise.cpp | 87 |
1 files changed, 78 insertions, 9 deletions
diff --git a/src/2geom/pointwise.cpp b/src/2geom/pointwise.cpp index 0115ea103..1d1c69cee 100644 --- a/src/2geom/pointwise.cpp +++ b/src/2geom/pointwise.cpp @@ -30,23 +30,26 @@ */ #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<int,Satellite> > satellites) +Pointwise::Pointwise(Piecewise<D2<SBasis> > pwd2, std::vector<std::pair<unsigned int,Satellite> > satellites) : _pwd2(pwd2), _satellites(satellites) { }; Pointwise::~Pointwise(){}; -std::vector<std::pair<int,Satellite> > +std::vector<std::pair<unsigned int,Satellite> > Pointwise::getSatellites(){ return _satellites; } void -Pointwise::setSatellites(std::vector<std::pair<int,Satellite> > sat){ +Pointwise::setSatellites(std::vector<std::pair<unsigned int,Satellite> > sat){ _satellites = sat; } @@ -60,11 +63,77 @@ Pointwise::setPwd2(Piecewise<D2<SBasis> > pwd2_in){ _pwd2 = pwd2_in; } +double +Pointwise::rad_to_len(double A, std::pair<unsigned int,Geom::Satellite> satellite) +{ + double len = 0; + boost::optional<Geom::D2<Geom::SBasis> > d2_in = getCurveIn(satellite); + if(d2_in){ + Geom::D2<Geom::SBasis> d2_out = _pwd2[satellite.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 = satellite.second.toSize(p0pt,d2_out); + } else { + if(A > 0){ + len = rad_to_len(A * -1, satellite); + } + } + } + return len; +} + +double +Pointwise::len_to_rad(double A, std::pair<unsigned int,Geom::Satellite> satellite) +{ + boost::optional<Geom::D2<Geom::SBasis> > d2_in = getCurveIn(satellite); + if(d2_in){ + Geom::D2<Geom::SBasis> d2_out = _pwd2[satellite.first]; + double time_in = satellite.second.getOpositeTime(A, *d2_in); + double time_out = satellite.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; +} + boost::optional<Geom::D2<Geom::SBasis> > -Pointwise::getCurveIn(std::pair<int,Satellite> sat){ +Pointwise::getCurveIn(std::pair<unsigned int,Satellite> sat){ //curve out = sat.first; std::vector<Geom::Path> path_in_processed = pathv_to_linear_and_cubic_beziers(path_from_piecewise(_pwd2, 0.001)); - int counterTotal = 0; + unsigned int counterTotal = 0; for (PathVector::const_iterator path_it = path_in_processed.begin(); path_it != path_in_processed.end(); ++path_it) { if (path_it->empty()){ continue; @@ -85,7 +154,7 @@ Pointwise::getCurveIn(std::pair<int,Satellite> sat){ } Geom::Path::const_iterator curve_end = curve_endit; --curve_end; - int counter = 0; + unsigned int counter = 0; while (curve_it1 != curve_endit) { if(counterTotal == sat.first){ if (counter==0) { @@ -107,7 +176,7 @@ Pointwise::getCurveIn(std::pair<int,Satellite> sat){ } std::vector<Satellite> -Pointwise::findSatellites(int A, int B) const +Pointwise::findSatellites(unsigned int A, int B) const { std::vector<Satellite> ret; int counter = 0; @@ -124,7 +193,7 @@ Pointwise::findSatellites(int A, int B) const } std::vector<Satellite> -Pointwise::findClosingSatellites(int A) const +Pointwise::findClosingSatellites(unsigned int A) const { std::vector<Satellite> ret; bool finded = false; @@ -143,7 +212,7 @@ Pointwise::findClosingSatellites(int A) const } std::vector<Satellite> -Pointwise::findPeviousSatellites(int A, int B) const +Pointwise::findPeviousSatellites(unsigned int A, int B) const { std::vector<Satellite> ret; for(unsigned i = 0; i < _satellites.size(); i++){ |
