summaryrefslogtreecommitdiffstats
path: root/src/2geom/linear.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/2geom/linear.h')
-rw-r--r--src/2geom/linear.h66
1 files changed, 41 insertions, 25 deletions
diff --git a/src/2geom/linear.h b/src/2geom/linear.h
index 8c154364e..b0306fb9f 100644
--- a/src/2geom/linear.h
+++ b/src/2geom/linear.h
@@ -1,7 +1,7 @@
/**
* \file
* \brief Linear fragment function class
- *
+ *//*
* Authors:
* Nathan Hurst <njh@mail.csse.monash.edu.au>
* Michael Sloan <mgsloan@gmail.com>
@@ -32,12 +32,12 @@
* the specific language governing rights and limitations.
*/
-#ifndef SEEN_LINEAR_H
-#define SEEN_LINEAR_H
+#ifndef LIB2GEOM_SEEN_LINEAR_H
+#define LIB2GEOM_SEEN_LINEAR_H
+
#include <2geom/interval.h>
#include <2geom/math-utils.h>
-
//#define USE_SBASIS_OF
#ifdef USE_SBASIS_OF
@@ -46,48 +46,60 @@
#else
-namespace Geom{
-
-inline double lerp(double t, double a, double b) { return a*(1-t) + b*t; }
+namespace Geom {
class SBasis;
-class Linear{
+/**
+ * @brief Function that interpolates linearly between two values.
+ * @ingroup Fragments
+ */
+class Linear {
public:
double a[2];
Linear() {a[0]=0; a[1]=0;}
Linear(double aa, double b) {a[0] = aa; a[1] = b;}
Linear(double aa) {a[0] = aa; a[1] = aa;}
- double operator[](const int i) const {
- assert(i >= 0);
+ double operator[](unsigned i) const {
assert(i < 2);
return a[i];
}
- double& operator[](const int i) {
- assert(i >= 0);
+ double &operator[](unsigned i) {
assert(i < 2);
return a[i];
}
//IMPL: FragmentConcept
typedef double output_type;
- inline bool isZero(double eps=EPSILON) const { return are_near(a[0], 0., eps) && are_near(a[1], 0., eps); }
- inline bool isConstant(double eps=EPSILON) const { return are_near(a[0], a[1], eps); }
- inline bool isFinite() const { return IS_FINITE(a[0]) && IS_FINITE(a[1]); }
-
- inline double at0() const { return a[0]; }
- inline double at1() const { return a[1]; }
-
- inline double valueAt(double t) const { return lerp(t, a[0], a[1]); }
- inline double operator()(double t) const { return valueAt(t); }
+ bool isZero(double eps=EPSILON) const { return are_near(a[0], 0., eps) && are_near(a[1], 0., eps); }
+ bool isConstant(double eps=EPSILON) const { return are_near(a[0], a[1], eps); }
+ bool isFinite() const { return IS_FINITE(a[0]) && IS_FINITE(a[1]); }
+
+ Coord at0() const { return a[0]; }
+ Coord &at0() { return a[0]; }
+ Coord at1() const { return a[1]; }
+ Coord &at1() { return a[1]; }
+
+ double valueAt(double t) const { return lerp(t, a[0], a[1]); }
+ double operator()(double t) const { return valueAt(t); }
+
+ // not very useful, but required for ShapeConcept
+ std::vector<Coord> valueAndDerivatives(Coord t, unsigned n) {
+ std::vector<Coord> result(n+1, 0.0);
+ result[0] = valueAt(t);
+ if (n >= 1) {
+ result[1] = a[1] - a[0];
+ }
+ return result;
+ }
//defined in sbasis.h
inline SBasis toSBasis() const;
- inline OptInterval bounds_exact() const { return Interval(a[0], a[1]); }
- inline OptInterval bounds_fast() const { return bounds_exact(); }
- inline OptInterval bounds_local(double u, double v) const { return Interval(valueAt(u), valueAt(v)); }
+ OptInterval bounds_exact() const { return Interval(a[0], a[1]); }
+ OptInterval bounds_fast() const { return bounds_exact(); }
+ OptInterval bounds_local(double u, double v) const { return Interval(valueAt(u), valueAt(v)); }
double tri() const {
return a[1] - a[0];
@@ -98,6 +110,10 @@ public:
};
inline Linear reverse(Linear const &a) { return Linear(a[1], a[0]); }
+inline Linear portion(Linear const &a, Coord from, Coord to) {
+ Linear result(a.valueAt(from), a.valueAt(to));
+ return result;
+}
//IMPL: AddableConcept
inline Linear operator+(Linear const & a, Linear const & b) {
@@ -158,7 +174,7 @@ inline Linear operator/=(Linear & a, double b) {
}
#endif
-#endif //SEEN_LINEAR_H
+#endif //LIB2GEOM_SEEN_LINEAR_H
/*
Local Variables: