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.cpp87
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++){