/** * \file * \brief Linear fragment function class * * Authors: * 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_LINEAR_OF_H #define SEEN_LINEAR_OF_H #include <2geom/interval.h> #include <2geom/math-utils.h> namespace Geom{ template inline T lerp(double t, T a, T b) { return a*(1-t) + b*t; } template class SBasisOf; template class HatOf{ public: HatOf () {} HatOf(T d) :d(d) {} operator T() const { return d; } T d; }; template class TriOf{ public: TriOf () {} TriOf(double d) :d(d) {} operator T() const { return d; } T d; }; //-------------------------------------------------------------------------- #ifdef USE_SBASIS_OF template class LinearOf; typedef Geom::LinearOf Linear; #endif //-------------------------------------------------------------------------- template class LinearOf{ public: T a[2]; LinearOf() {} LinearOf(T aa, T b) {a[0] = aa; a[1] = b;} //LinearOf(double aa, double b) {a[0] = T(aa); a[1] = T(b);} LinearOf(HatOf h, TriOf t) { a[0] = T(h) - T(t)/2; a[1] = T(h) + T(t)/2; } LinearOf(HatOf h) { a[0] = T(h); a[1] = T(h); } unsigned input_dim(){return T::input_dim() + 1;} T operator[](const int i) const { assert(i >= 0); assert(i < 2); return a[i]; } T& operator[](const int i) { assert(i >= 0); assert(i < 2); return a[i]; } //IMPL: FragmentConcept typedef T output_type; inline bool isZero() const { return a[0].isZero() && a[1].isZero(); } inline bool isConstant() const { return a[0] == a[1]; } inline bool isFinite() const { return std::isfinite(a[0]) && std::isfinite(a[1]); } inline T at0() const { return a[0]; } inline T at1() const { return a[1]; } inline T valueAt(double t) const { return lerp(t, a[0], a[1]); } inline T operator()(double t) const { return valueAt(t); } //defined in sbasis.h inline SBasisOf toSBasis() const; //This is specific for T=double!! 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)); } operator TriOf() const { return a[1] - a[0]; } operator HatOf() const { return (a[1] + a[0])/2; } }; template <> unsigned LinearOf::input_dim(){return 1;} template <> inline OptInterval LinearOf::bounds_exact() const { return Interval(a[0], a[1]); } template <> inline OptInterval LinearOf::bounds_fast() const { return bounds_exact(); } template <> inline OptInterval LinearOf::bounds_local(double u, double v) const { return Interval(valueAt(u), valueAt(v)); } template <> inline bool LinearOf::isZero() const { return a[0]==0 && a[1]==0; } template inline LinearOf reverse(LinearOf const &a) { return LinearOf(a[1], a[0]); } //IMPL: AddableConcept template inline LinearOf operator+(LinearOf const & a, LinearOf const & b) { return LinearOf(a[0] + b[0], a[1] + b[1]); } template inline LinearOf operator-(LinearOf const & a, LinearOf const & b) { return LinearOf(a[0] - b[0], a[1] - b[1]); } template inline LinearOf& operator+=(LinearOf & a, LinearOf const & b) { a[0] += b[0]; a[1] += b[1]; return a; } template inline LinearOf& operator-=(LinearOf & a, LinearOf const & b) { a[0] -= b[0]; a[1] -= b[1]; return a; } //IMPL: OffsetableConcept template inline LinearOf operator+(LinearOf const & a, double b) { return LinearOf(a[0] + b, a[1] + b); } template inline LinearOf operator-(LinearOf const & a, double b) { return LinearOf(a[0] - b, a[1] - b); } template inline LinearOf& operator+=(LinearOf & a, double b) { a[0] += b; a[1] += b; return a; } template inline LinearOf& operator-=(LinearOf & a, double b) { a[0] -= b; a[1] -= b; return a; } /* //We can in fact offset in coeff ring T... template inline LinearOf operator+(LinearOf const & a, T b) { return LinearOf(a[0] + b, a[1] + b); } template inline LinearOf operator-(LinearOf const & a, T b) { return LinearOf(a[0] - b, a[1] - b); } template inline LinearOf& operator+=(LinearOf & a, T b) { a[0] += b; a[1] += b; return a; } template inline LinearOf& operator-=(LinearOf & a, T b) { a[0] -= b; a[1] -= b; return a; } */ //IMPL: boost::EqualityComparableConcept template inline bool operator==(LinearOf const & a, LinearOf const & b) { return a[0] == b[0] && a[1] == b[1]; } template inline bool operator!=(LinearOf const & a, LinearOf const & b) { return a[0] != b[0] || a[1] != b[1]; } //IMPL: ScalableConcept template inline LinearOf operator-(LinearOf const &a) { return LinearOf(-a[0], -a[1]); } template inline LinearOf operator*(LinearOf const & a, double b) { return LinearOf(a[0]*b, a[1]*b); } template inline LinearOf operator/(LinearOf const & a, double b) { return LinearOf(a[0]/b, a[1]/b); } template inline LinearOf operator*=(LinearOf & a, double b) { a[0] *= b; a[1] *= b; return a; } template inline LinearOf operator/=(LinearOf & a, double b) { a[0] /= b; a[1] /= b; return a; } /* //We can in fact rescale in coeff ring T... (but not divide!) template inline LinearOf operator*(LinearOf const & a, T b) { return LinearOf(a[0]*b, a[1]*b); } template inline LinearOf operator/(LinearOf const & a, T b) { return LinearOf(a[0]/b, a[1]/b); } template inline LinearOf operator*=(LinearOf & a, T b) { a[0] *= b; a[1] *= b; return a; } */ }; #endif //SEEN_LINEAR_OF_H /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :