summaryrefslogtreecommitdiffstats
path: root/src/helper/geom-satellite.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-05-09 20:48:48 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-05-09 20:48:48 +0000
commit3ce6cb91e8259ec064956c79c2cc4f9050dccbce (patch)
tree32c37696d62b47f8e01dae448a07fdaff70d471b /src/helper/geom-satellite.cpp
parentupdate to trunk (diff)
downloadinkscape-3ce6cb91e8259ec064956c79c2cc4f9050dccbce.tar.gz
inkscape-3ce6cb91e8259ec064956c79c2cc4f9050dccbce.zip
fixing review
(bzr r13645.1.86)
Diffstat (limited to 'src/helper/geom-satellite.cpp')
-rw-r--r--src/helper/geom-satellite.cpp201
1 files changed, 98 insertions, 103 deletions
diff --git a/src/helper/geom-satellite.cpp b/src/helper/geom-satellite.cpp
index efe6bb37a..397a556a9 100644
--- a/src/helper/geom-satellite.cpp
+++ b/src/helper/geom-satellite.cpp
@@ -17,38 +17,32 @@
#include <2geom/ray.h>
#include <boost/optional.hpp>
-namespace Geom {
-
/**
* @brief Satellite a per ?node/curve holder of data.
*/
Satellite::Satellite() {}
-;
-Satellite::Satellite(SatelliteType satelliteType, bool isTime, bool active,
- bool hasMirror, bool hidden, double amount, double angle,
- size_t steps)
- : satelliteType(satelliteType), isTime(isTime), active(active),
- hasMirror(hasMirror), hidden(hidden), amount(amount), angle(angle),
- steps(steps) {}
-;
+
+Satellite::Satellite(SatelliteType satellite_type)
+ : satellite_type(satellite_type)
+{}
Satellite::~Satellite() {}
-;
/**
* Calculate the time in d2_in with a size of A
+ * TODO: find a better place to it
*/
-double Satellite::toTime(double A, Geom::D2<Geom::SBasis> d2_in) const
+double timeAtArcLength(double A, Geom::D2<Geom::SBasis> const d2_in)
{
if (!d2_in.isFinite() || d2_in.isZero() || A == 0) {
return 0;
}
double t = 0;
- double lenghtPart = Geom::length(d2_in, Geom::EPSILON);
- if (A > lenghtPart || d2_in[0].degreesOfFreedom() == 2) {
- if (lenghtPart != 0) {
- t = A / lenghtPart;
+ double length_part = Geom::length(d2_in, Geom::EPSILON);
+ if (A > length_part || d2_in[0].degreesOfFreedom() == 2) {
+ if (length_part != 0) {
+ t = A / length_part;
}
} else if (d2_in[0].degreesOfFreedom() != 2) {
Geom::Piecewise<Geom::D2<Geom::SBasis> > u;
@@ -65,16 +59,17 @@ double Satellite::toTime(double A, Geom::D2<Geom::SBasis> d2_in) const
/**
* Calculate the size in d2_in with a point at A
+ * TODO: find a better place to it
*/
-double Satellite::toSize(double A, Geom::D2<Geom::SBasis> d2_in) const
+double arcLengthAt(double A, Geom::D2<Geom::SBasis> const d2_in)
{
if (!d2_in.isFinite() || d2_in.isZero() || A == 0) {
return 0;
}
double s = 0;
- double lenghtPart = Geom::length(d2_in, Geom::EPSILON);
- if (A > lenghtPart || d2_in[0].degreesOfFreedom() == 2) {
- s = (A * lenghtPart);
+ double length_part = Geom::length(d2_in, Geom::EPSILON);
+ if (A > length_part || d2_in[0].degreesOfFreedom() == 2) {
+ s = (A * length_part);
} else if (d2_in[0].degreesOfFreedom() != 2) {
Geom::Piecewise<Geom::D2<Geom::SBasis> > u;
u.push_cut(0);
@@ -86,81 +81,79 @@ double Satellite::toSize(double A, Geom::D2<Geom::SBasis> d2_in) const
}
/**
- * Calculate the lenght of a satellite from a radious A input.
+ * Calculate the length of a satellite from a radious A input.
+ * convert a arc radius to a satellite length
*/
double Satellite::radToLen(
- double A, boost::optional<Geom::D2<Geom::SBasis> > d2_in,
- Geom::D2<Geom::SBasis> d2_out,
- boost::optional<Geom::Satellite> previousSatellite) const
+ double A, Geom::D2<Geom::SBasis> const d2_in,
+ Geom::D2<Geom::SBasis> const d2_out,
+ Satellite const previousSatellite) const
{
double len = 0;
- if (d2_in && previousSatellite) {
- 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 = (*previousSatellite).toSize(p0pt, d2_out);
- } else {
- if (A > 0) {
- len = radToLen(A * -1, *d2_in, d2_out, previousSatellite);
- }
+ 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 = arcLengthAt(p0pt, d2_out);
+ } else {
+ if (A > 0) {
+ len = radToLen(A * -1, d2_in, d2_out, previousSatellite);
}
}
return len;
}
/**
-* Calculate the radious of a satellite from a lenght A input.
+* Calculate the radious of a satellite from a length A input.
+* convert a satellite length to a arc radius
*/
double Satellite::lenToRad(
- double A, boost::optional<Geom::D2<Geom::SBasis> > d2_in,
- Geom::D2<Geom::SBasis> d2_out,
- boost::optional<Geom::Satellite> previousSatellite) const
+ double A, Geom::D2<Geom::SBasis> const d2_in,
+ Geom::D2<Geom::SBasis> const d2_out,
+ Satellite const previousSatellite) const
{
- if (d2_in && previousSatellite) {
- double time_in = (*previousSatellite).time(A, true, *d2_in);
- double time_out = (*previousSatellite).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 *C = path_from_piecewise(u, 0.1)[0][0].duplicate();
- Piecewise<D2<SBasis> > u2;
- u2.push_cut(0);
- u2.push(d2_out, 1);
- Geom::Curve *D = path_from_piecewise(u2, 0.1)[0][0].duplicate();
- Curve *knotCurve1 = C->portion(0, time_in);
- Curve *knotCurve2 = D->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;
- }
+ double time_in = (previousSatellite).time(A, true, d2_in);
+ double time_out = timeAtArcLength(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 *C = path_from_piecewise(u, 0.1)[0][0].duplicate();
+ Piecewise<D2<SBasis> > u2;
+ u2.push_cut(0);
+ u2.push(d2_out, 1);
+ Geom::Curve *D = path_from_piecewise(u2, 0.1)[0][0].duplicate();
+ Curve *knotCurve1 = C->portion(0, time_in);
+ Curve *knotCurve2 = D->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;
}
@@ -171,8 +164,8 @@ double Satellite::lenToRad(
double Satellite::time(Geom::D2<Geom::SBasis> d2_in) const
{
double t = amount;
- if (!isTime) {
- t = toTime(t, d2_in);
+ if (!is_time) {
+ t = timeAtArcLength(t, d2_in);
}
if (t > 1) {
t = 1;
@@ -181,7 +174,7 @@ double Satellite::time(Geom::D2<Geom::SBasis> d2_in) const
}
/**.
- * Get the time from a lenght A in other curve, a bolean I gived to reverse time
+ * Get the time from a length A in other curve, a bolean I gived to reverse time
*/
double Satellite::time(double A, bool I,
Geom::D2<Geom::SBasis> d2_in) const
@@ -193,21 +186,21 @@ double Satellite::time(double A, bool I,
return 0;
}
if (!I) {
- return toTime(A, d2_in);
+ return timeAtArcLength(A, d2_in);
}
- double lenghtPart = Geom::length(d2_in, Geom::EPSILON);
- A = lenghtPart - A;
- return toTime(A, d2_in);
+ double length_part = Geom::length(d2_in, Geom::EPSILON);
+ A = length_part - A;
+ return timeAtArcLength(A, d2_in);
}
/**
- * Get the lenght of the satellite in d2_in
+ * Get the length of the satellite in d2_in
*/
-double Satellite::size(Geom::D2<Geom::SBasis> d2_in) const
+double Satellite::arcDistance(Geom::D2<Geom::SBasis> d2_in) const
{
double s = amount;
- if (isTime) {
- s = toSize(s, d2_in);
+ if (is_time) {
+ s = arcLengthAt(s, d2_in);
}
return s;
}
@@ -227,8 +220,8 @@ Geom::Point Satellite::getPosition(Geom::D2<Geom::SBasis> d2_in) const
void Satellite::setPosition(Geom::Point p, Geom::D2<Geom::SBasis> d2_in)
{
double A = Geom::nearest_point(p, d2_in);
- if (!isTime) {
- A = toSize(A, d2_in);
+ if (!is_time) {
+ A = arcLengthAt(A, d2_in);
}
amount = A;
}
@@ -238,9 +231,13 @@ void Satellite::setPosition(Geom::Point p, Geom::D2<Geom::SBasis> d2_in)
*/
void Satellite::setSatelliteType(gchar const *A)
{
- std::map<std::string, SatelliteType> GcharMapToSatelliteType =
- boost::assign::map_list_of("F", F)("IF", IF)("C", C)("IC", IC)("KO", KO);
- satelliteType = GcharMapToSatelliteType.find(std::string(A))->second;
+ std::map<std::string, SatelliteType> gchar_map_to_satellite_type =
+ boost::assign::map_list_of("F", FILLET)("IF", INVERSE_FILLET)("C", CHAMFER)("IC", INVERSE_CHAMFER)("KO", INVALID_SATELLITE);
+ std::map<std::string, SatelliteType>::iterator it = gchar_map_to_satellite_type.find(std::string(A));
+ if(it != gchar_map_to_satellite_type.end())
+ {
+ satellite_type = it->second;
+ }
}
/**
@@ -248,13 +245,11 @@ void Satellite::setSatelliteType(gchar const *A)
*/
gchar const *Satellite::getSatelliteTypeGchar() const
{
- std::map<SatelliteType, gchar const *> SatelliteTypeToGcharMap =
- boost::assign::map_list_of(F, "F")(IF, "IF")(C, "C")(IC, "IC")(KO, "KO");
- return SatelliteTypeToGcharMap.at(satelliteType);
+ std::map<SatelliteType, gchar const *> satellite_type_to_gchar_map =
+ boost::assign::map_list_of(FILLET, "F")(INVERSE_FILLET, "IF")(CHAMFER, "C")(INVERSE_CHAMFER, "IC")(INVALID_SATELLITE, "KO");
+ return satellite_type_to_gchar_map.at(satellite_type);
}
-} //namespace Geom
-
/*
Local Variables:
mode:c++