/** * @file * @brief LinearN fragment function class *//* * Authors: * JF Barraud * Nathan Hurst * Michael Sloan * * Copyright (C) 2006-2007 authors * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. */ #ifndef SEEN_LINEARN_H #define SEEN_LINEARN_H #include <2geom/interval.h> #include <2geom/math-utils.h> #include <2geom/linear.h> //for conversion purpose ( + lerp() ) #include namespace Geom{ //TODO: define this only once!! (see linear.h) inline double lerpppp(double t, double a, double b) { return a*(1-t) + b*t; } template class SBasisN; template class LinearN{ public: double a[1< const &aa, LinearN const &b, unsigned var=0) { // for (unsigned i=0; i<(1<= 0 ); assert( i < (1<= 0); assert(i < (1< at0(unsigned k=0) const { LinearN res; unsigned mask = (1< at1(unsigned k=0) const { LinearN res; for (unsigned i=0; i < (1<<(n-1)); i++){ unsigned mask = (1< partialEval(double t, unsigned var=0 ) const { LinearN res; res = at0(var)*(1-t) + at1(var)*t; return res; } //fixed and flags are used for recursion. inline double valueAt(double t[], unsigned fixed=0, unsigned flags=0 ) const { if (fixed == n) { return a[flags]; }else{ double a0 = valueAt(t, fixed+1, flags); double a1 = valueAt(t, fixed+1, flags|(1< toSBasisN() const; inline OptInterval bounds_exact() const { double min=a[0], max=a[0]; for (unsigned i=1; i < (1< max) max = a[i]; } return Interval(min, max); } inline OptInterval bounds_fast() const { return bounds_exact(); } //inline OptInterval bounds_local(double u, double v) const { return Interval(valueAt(u), valueAt(v)); } }; //LinearN<0> are doubles. Specialize them out. template<> class LinearN<0>{ public: double d; LinearN () {} LinearN(double d) :d(d) {} operator double() const { return d; } double operator[](const int i) const {assert (i==0); return d;} double& operator[](const int i) {assert (i==0); return d;} typedef double output_type; unsigned input_dim() const {return 0;} inline bool isZero() const { return d==0; } inline bool isConstant() const { return true; } inline bool isFinite() const { return std::isfinite(d); } }; //LinearN<1> are usual Linear. Allow conversion. Linear toLinear(LinearN<1> f){ return Linear(f[0],f[1]); } //inline Linear reverse(Linear const &a) { return Linear(a[1], a[0]); } //IMPL: AddableConcept template inline LinearN operator+(LinearN const & a, LinearN const & b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN operator-(LinearN const & a, LinearN const & b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN& operator+=(LinearN & a, LinearN const & b) { for (unsigned i=0; i < (1< inline LinearN& operator-=(LinearN & a, LinearN const & b) { for (unsigned i=0; i < (1< inline LinearN operator+(LinearN const & a, double b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN operator-(LinearN const & a, double b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN& operator+=(LinearN & a, double b) { for (unsigned i=0; i < (1< inline LinearN& operator-=(LinearN & a, double b) { for (unsigned i=0; i < (1< inline bool operator==(LinearN const & a, LinearN const & b) { for (unsigned i=0; i < (1< inline bool operator!=(LinearN const & a, LinearN const & b) { return !(a==b); } //IMPL: ScalableConcept template inline LinearN operator-(LinearN const &a) { LinearN res; for (unsigned i=0; i < (1< inline LinearN operator*(LinearN const & a, double b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN operator/(LinearN const & a, double b) { LinearN res; for (unsigned i=0; i < (1< inline LinearN operator*=(LinearN & a, double b) { for (unsigned i=0; i < (1< inline LinearN operator/=(LinearN & a, double b) { for (unsigned i=0; i < (1< void setToVariable(LinearN &x, unsigned k){; x = LinearN(0.); unsigned mask = 1< inline std::ostream &operator<< (std::ostream &out_file, const LinearN &bo) { out_file << "{"; for (unsigned i=0; i < (1<