summaryrefslogtreecommitdiffstats
path: root/src/2geom
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-03-04 22:42:59 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-03-04 22:42:59 +0000
commit1db09cce6114c1b2d95ac77b00672caad0447b29 (patch)
tree8aa92d59737bc340b63bd73c368f856da0a46a51 /src/2geom
parentupdate to trunk (diff)
downloadinkscape-1db09cce6114c1b2d95ac77b00672caad0447b29.tar.gz
inkscape-1db09cce6114c1b2d95ac77b00672caad0447b29.zip
All features done, only need piecewise update function
(bzr r13645.1.33)
Diffstat (limited to 'src/2geom')
-rw-r--r--src/2geom/pointwise.cpp87
-rw-r--r--src/2geom/pointwise.h25
-rw-r--r--src/2geom/satellite.cpp4
-rw-r--r--src/2geom/satellite.h13
4 files changed, 106 insertions, 23 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++){
diff --git a/src/2geom/pointwise.h b/src/2geom/pointwise.h
index aa907d498..b6bd4c4fd 100644
--- a/src/2geom/pointwise.h
+++ b/src/2geom/pointwise.h
@@ -64,29 +64,32 @@ class Pointwise
{
public:
Pointwise(){};
- Pointwise(Piecewise<D2<SBasis> > pwd2, std::vector<std::pair<int,Satellite> > satellites);
+ Pointwise(Piecewise<D2<SBasis> > pwd2, std::vector<std::pair<unsigned int,Satellite> > satellites);
virtual ~Pointwise();
- std::vector<Satellite> findSatellites(int A, int B = -1) const;
- std::vector<Satellite> findPeviousSatellites(int A, int B) const;
- std::vector<Satellite> findClosingSatellites(int A) const;
- std::vector<std::pair<int,Satellite> > getSatellites();
- void setSatellites(std::vector<std::pair<int,Satellite> > sat);
+ std::vector<Satellite> findSatellites(unsigned int A, int B = -1) const;
+ std::vector<Satellite> findPeviousSatellites(unsigned int A, int B) const;
+ std::vector<Satellite> findClosingSatellites(unsigned int A) const;
+ double rad_to_len(double A, std::pair<unsigned int,Geom::Satellite> satellite);
+ double len_to_rad(double A, std::pair<unsigned int,Geom::Satellite> satellite);
+ std::vector<std::pair<unsigned int,Satellite> > getSatellites();
+ void setSatellites(std::vector<std::pair<unsigned int,Satellite> > sat);
Piecewise<D2<SBasis> > getPwd2();
void setPwd2(Piecewise<D2<SBasis> > pwd2_in);
- boost::optional<Geom::D2<Geom::SBasis> > getCurveIn(std::pair<int,Satellite> sat);
+ boost::optional<Geom::D2<Geom::SBasis> > getCurveIn(std::pair<unsigned int,Satellite> sat);
Pointwise recalculate_for_new_pwd2(Piecewise<D2<SBasis> > A);
+ /*
Pointwise pwd2_reverse(int index);
Pointwise pwd2_append(int index);
Pointwise pwd2_prepend(int index);
Pointwise pwd2_add(int index);
Pointwise pwd2_del(int index);
- Pointwise satellite_add(int index,Satellite sat);
- Pointwise satellite_del(int index,Satellite sat);
-
+ Pointwise satellite_add(unsigned int index,Satellite sat);
+ Pointwise satellite_del(unsigned int index,Satellite sat);
+ */
private:
Piecewise<D2<SBasis> > _pwd2;
- std::vector<std::pair<int,Satellite> > _satellites;
+ std::vector<std::pair<unsigned int,Satellite> > _satellites;
};
diff --git a/src/2geom/satellite.cpp b/src/2geom/satellite.cpp
index c216595dc..22c3c8bed 100644
--- a/src/2geom/satellite.cpp
+++ b/src/2geom/satellite.cpp
@@ -40,8 +40,8 @@ namespace Geom {
Satellite::Satellite(){};
-Satellite::Satellite(SatelliteType satellitetype, bool isTime, bool isClosing, bool isStart, bool active, bool hasMirror, bool hidden, double ammount, double angle)
- : _satellitetype(satellitetype), _isTime(isTime), _isClosing(isClosing), _isStart(isStart), _active(active), _hasMirror(hasMirror), _hidden(hidden), _ammount(ammount), _angle(angle){};
+Satellite::Satellite(SatelliteType satellitetype, bool isTime, bool isClosing, bool isStart, bool active, bool hasMirror, bool hidden, double ammount, double angle, unsigned int steps)
+ : _satellitetype(satellitetype), _isTime(isTime), _isClosing(isClosing), _isStart(isStart), _active(active), _hasMirror(hasMirror), _hidden(hidden), _ammount(ammount), _angle(angle), _steps(steps){};
Satellite::~Satellite() {};
diff --git a/src/2geom/satellite.h b/src/2geom/satellite.h
index 48be13cc4..4b0797620 100644
--- a/src/2geom/satellite.h
+++ b/src/2geom/satellite.h
@@ -45,7 +45,7 @@ class Satellite
public:
Satellite();
- Satellite(SatelliteType satellitetype, bool isTime, bool isClosing, bool isStart, bool active, bool hasMirror, bool hidden, double ammount, double angle);
+ Satellite(SatelliteType satellitetype, bool isTime, bool isClosing, bool isStart, bool active, bool hasMirror, bool hidden, double ammount, double angle, unsigned int steps);
virtual ~Satellite();
@@ -99,6 +99,11 @@ class Satellite
_angle = A;
}
+ void setSteps(int A)
+ {
+ _steps = A;
+ }
+
SatelliteType getSatelliteType() const
{
return _satellitetype;
@@ -150,6 +155,11 @@ class Satellite
return _angle;
}
+ int getSteps() const
+ {
+ return _steps;
+ }
+
void setPosition(Geom::Point p, Geom::D2<Geom::SBasis> d2_in);
Geom::Point getPosition(Geom::D2<Geom::SBasis> curve);
double getSize(Geom::D2<Geom::SBasis> d2_in);
@@ -169,6 +179,7 @@ class Satellite
bool _hidden;
double _ammount;
double _angle;
+ unsigned int _steps;
};
} // end namespace Geom