BernsteinTriangularPoly.h

00001 //===========================================================================
00002 // GoTools - SINTEF Geometry Tools
00003 //
00004 // GoTools module: Implicitization, version 1.0
00005 //
00006 // Copyright (C) 2000-2007 SINTEF ICT, Applied Mathematics, Norway.
00007 //
00008 // This program is free software; you can redistribute it and/or          
00009 // modify it under the terms of the GNU General Public License            
00010 // as published by the Free Software Foundation version 2 of the License. 
00011 //
00012 // This program is distributed in the hope that it will be useful,        
00013 // but WITHOUT ANY WARRANTY; without even the implied warranty of         
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          
00015 // GNU General Public License for more details.                           
00016 //
00017 // You should have received a copy of the GNU General Public License      
00018 // along with this program; if not, write to the Free Software            
00019 // Foundation, Inc.,                                                      
00020 // 59 Temple Place - Suite 330,                                           
00021 // Boston, MA  02111-1307, USA.                                           
00022 //
00023 // Contact information: E-mail: tor.dokken@sintef.no                      
00024 // SINTEF ICT, Department of Applied Mathematics,                         
00025 // P.O. Box 124 Blindern,                                                 
00026 // 0314 Oslo, Norway.                                                     
00027 //
00028 // Other licenses are also available for this software, notably licenses
00029 // for:
00030 // - Building commercial software.                                        
00031 // - Building software whose source code you wish to keep private.        
00032 //===========================================================================
00033 #ifndef _BERNSTEINTRIANGULARPOLY_H
00034 #define _BERNSTEINTRIANGULARPOLY_H
00035 
00036 
00037 #include "Array.h"
00038 #include "ScratchVect.h"
00039 #include "errormacros.h"
00040 #include <vector>
00041 #include <iostream>
00042 
00043 
00044 namespace Go {
00047 
00048 
00049 
00062 class BernsteinTriangularPoly {
00063 public:
00065     BernsteinTriangularPoly() : deg_(-1) { }
00069     BernsteinTriangularPoly(int deg, const std::vector<double>& coefs)
00070         : deg_(deg), coefs_(coefs) { }
00076     template <typename ForwardIterator>
00077     BernsteinTriangularPoly(int deg,
00078                             ForwardIterator begin, ForwardIterator end)
00079         : deg_(deg), coefs_(begin, end) { }
00082     explicit BernsteinTriangularPoly(double coef)
00083         : deg_(0), coefs_(1, coef) { }
00084 
00087     int degree() const
00088     { return deg_; }
00089 
00091     const double operator[] (int num) const
00092     { return coefs_[num]; }
00094     double& operator[] (int num)
00095     { return coefs_[num]; }
00096 
00102     template <typename T>
00103     T operator() (const Array<T, 3>& u) const
00104     {
00105         // Adapted from the de Casteljau algorithm 'tri_decas' in Farin,
00106         // "Curves and Surfaces for CAGD".
00107 
00108         ASSERT(deg_ >= 0);
00109 
00110         int sz = coefs_.size();
00111         std::vector<T> tmp(sz);
00112         for (int i = 0; i < sz; ++i) {
00113             tmp[i] = T(coefs_[i]);
00114         }
00115 
00116         for (int r = 1; r <= deg_; ++r) {
00117             int m = -1;
00118             for (int i = 0; i <= deg_-r; ++i) {
00119                 for (int l = 0; l <= i; ++l) {
00120                     m++;
00121                     tmp[m] = u[0] * tmp[m]
00122                         + u[1] * tmp[m + 1 + i]
00123                         + u[2] * tmp[m + 2 + i];
00124                 }
00125             }
00126         }
00127 
00128         return tmp[0];
00129     }
00130 
00135     double norm() const;
00139     void normalize();
00140 
00147     void deriv(int der, const Vector3D& d,
00148                BernsteinTriangularPoly& btp) const;
00149 
00159     template <typename T>
00160     T blossom(const std::vector<Array<T, 3> >& uvec) const
00161     {
00162         // This routine is a natural extension of operator().
00163 
00164         ASSERT(deg_ >= 0);
00165 
00166         int sz = coefs_.size();
00167         std::vector<T> tmp(sz);
00168         for (int i = 0; i < sz; ++i)
00169             tmp[i] = T(coefs_[i]);
00170 
00171         for (int r = 1; r <= deg_; ++r) {
00172             const T& u = uvec[r-1][0];
00173             const T& v = uvec[r-1][1];
00174             const T& w = uvec[r-1][2];
00175             int m = -1;
00176             for (int i = 0; i <= deg_-r; ++i) {
00177                 for (int l = 0; l <= i; ++l) {
00178                     m++;
00179                     tmp[m] = u * tmp[m]
00180                         + v * tmp[m + 1 + i]
00181                         + w * tmp[m + 2 + i];
00182                 }
00183             }
00184         }
00185 
00186         return tmp[0];
00187     }
00188 
00190     BernsteinTriangularPoly& operator*= (const BernsteinTriangularPoly& poly);
00192     BernsteinTriangularPoly& operator*= (double c);
00193 
00195     BernsteinTriangularPoly& operator+= (const BernsteinTriangularPoly& poly);
00197     BernsteinTriangularPoly& operator+= (double c);
00198 
00200     BernsteinTriangularPoly& operator-= (const BernsteinTriangularPoly& poly);
00202     BernsteinTriangularPoly& operator-= (double c);
00203 
00205     BernsteinTriangularPoly& operator/= (double c);
00206 
00208     void read(std::istream& is);
00210     void write(std::ostream& os) const;
00211 
00212 private:
00213     int deg_;
00214     //typedef ScratchVect<double, 21> VecType;
00215     typedef std::vector<double> VecType;
00216     VecType coefs_;
00217 };
00218 
00219 
00221 inline BernsteinTriangularPoly operator* (const BernsteinTriangularPoly& p1,
00222                                           const BernsteinTriangularPoly& p2)
00223 {
00224     BernsteinTriangularPoly tmp = p1;
00225     tmp *= p2;
00226     return tmp;
00227 }
00228 
00229 
00231 inline BernsteinTriangularPoly operator* (const BernsteinTriangularPoly& p,
00232                                           double c)
00233 {
00234     BernsteinTriangularPoly tmp = p;
00235     tmp *= c;
00236     return tmp;
00237 }
00238 
00239 
00241 inline BernsteinTriangularPoly operator* (double c,
00242                                           const BernsteinTriangularPoly& p)
00243 {
00244     BernsteinTriangularPoly tmp = p;
00245     tmp *= c;
00246     return tmp;
00247 }
00248 
00249 
00251 inline BernsteinTriangularPoly operator+ (const BernsteinTriangularPoly& p1,
00252                                           const BernsteinTriangularPoly& p2)
00253 {
00254     BernsteinTriangularPoly tmp = p1;
00255     tmp += p2;
00256     return tmp;
00257 }
00258 
00259 
00261 inline BernsteinTriangularPoly operator+ (double c,
00262                                           const BernsteinTriangularPoly& p)
00263 {
00264     BernsteinTriangularPoly tmp = p;
00265     tmp += c;
00266     return tmp;
00267 }
00268 
00269 
00271 inline BernsteinTriangularPoly operator+ (const BernsteinTriangularPoly& p,
00272                                           double c)
00273 {
00274     BernsteinTriangularPoly tmp = p;
00275     tmp += c;
00276     return tmp;
00277 }
00278 
00279 
00281 inline BernsteinTriangularPoly operator- (const BernsteinTriangularPoly& p1,
00282                                           const BernsteinTriangularPoly& p2)
00283 {
00284     BernsteinTriangularPoly tmp = p1;
00285     tmp -= p2;
00286     return tmp;
00287 }
00288 
00289 
00291 inline BernsteinTriangularPoly operator- (double c,
00292                                           const BernsteinTriangularPoly& p)
00293 {
00294     BernsteinTriangularPoly tmp(c);
00295     tmp -= p;
00296     return tmp;
00297 }
00298 
00299 
00301 inline BernsteinTriangularPoly operator- (const BernsteinTriangularPoly& p,
00302                                           double c)
00303 {
00304     BernsteinTriangularPoly tmp = p;
00305     tmp -= c;
00306     return tmp;
00307 }
00308 
00309 
00311 inline BernsteinTriangularPoly operator/ (const BernsteinTriangularPoly& p,
00312                                           double c)
00313 {
00314     BernsteinTriangularPoly tmp = p;
00315     tmp /= c;
00316     return tmp;
00317 }
00318 
00319 
00321 inline std::istream& operator >> (std::istream& is,
00322                                   Go::BernsteinTriangularPoly& p)
00323 {
00324     p.read(is);
00325     return is;
00326 }
00327 
00329 inline std::ostream& operator << (std::ostream& os,
00330                                   const Go::BernsteinTriangularPoly& p)
00331 {
00332     p.write(os);
00333     return os;
00334 }
00335 
00336 
00338 } // namespace Go
00339 
00340 
00341 
00342 #endif // _BERNSTEINTRIANGULARPOLY_H
00343 
00344 

Generated on Mon Jun 11 15:13:16 2007 for GoTools Implicitization Library by  doxygen 1.5.1