00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
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
00106
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
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
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 }
00339
00340
00341
00342 #endif // _BERNSTEINTRIANGULARPOLY_H
00343
00344