00001
00023 #ifndef COMPUTE_H
00024 #define COMPUTE_H
00025
00026
00034 class CValue
00035 {
00036 public:
00040 enum TYPE_VARIABLE { TYPE_X, TYPE_Y, TYPE_Z };
00041
00046 virtual CValue* GetCopy() const = 0;
00047
00052 virtual float Compute(const CVector3f&) const = 0;
00053
00059 virtual CValue* Derive(TYPE_VARIABLE Type) const = 0;
00060
00065 virtual void Print(std::ostream&) const = 0;
00066
00071 virtual void Compile(std::vector<char>& v, int& i) const = 0;
00072
00076 virtual ~CValue() {};
00077
00078 static CValue* GetNewAddition(CValue* pLeftOperand, CValue* pRightOperand);
00079 static CValue* GetNewSubstraction(CValue* pLeftOperand,
00080 CValue* pRightOperand);
00081 static CValue* GetNewProduct(CValue* pLeftOperand, CValue* pRightOperand);
00082 static CValue* GetNewDivision(CValue* pLeftOperand, CValue* pRightOperand);
00083 static CValue* GetNewOpposite(CValue* pLeftOperand);
00084 static CValue* GetNewSqrt(CValue* pLeftOperand);
00085 static CValue* GetNewSin(CValue* pLeftOperand);
00086 static CValue* GetNewCos(CValue* pLeftOperand);
00087 static CValue* GetNewTan(CValue* pLeftOperand);
00088 static CValue* GetNewExp(CValue* pLeftOperand);
00089 static CValue* GetNewLn(CValue* pLeftOperand);
00090 static CValue* GetNewPow(CValue* pLeftOperand, CValue* pRightOperand);
00091
00097 virtual bool IsConstant(float* pNumber = NULL) const
00098 { return false; }
00099
00100 protected:
00106 virtual bool IsMultAbsorbElem() const { return false; }
00107
00113 virtual bool IsMultNeutralElem() const { return false; }
00114
00120 virtual bool IsAddNeutralElem() const { return false; }
00121
00122 };
00123
00124
00125
00129 class COperation : public CValue
00130 {
00131 public:
00135 COperation(CValue* pLeftOperand, CValue* pRightOperand)
00136 { m_pLeftOperand = pLeftOperand; m_pRightOperand = pRightOperand; }
00137
00142 virtual CValue* GetCopy() const = 0;
00143
00148 virtual float Compute(const CVector3f& Point) const = 0;
00149
00155 virtual CValue* Derive(TYPE_VARIABLE Type) const = 0;
00156
00161 virtual void Print(std::ostream&) const = 0;
00162
00167 virtual void Compile(std::vector<char>& v, int& i) const = 0;
00168
00172 virtual ~COperation()
00173 {
00174 if (m_pLeftOperand)
00175 delete m_pLeftOperand;
00176 if (m_pRightOperand)
00177 delete m_pRightOperand;
00178 }
00179
00180 protected:
00181 CValue* m_pLeftOperand;
00182 CValue* m_pRightOperand;
00183 };
00184
00185
00189 class CAddition : public COperation
00190 {
00191 public:
00192 CAddition(CValue* pLeftOperand, CValue* pRightOperand);
00193 virtual CValue* GetCopy() const;
00194 virtual float Compute(const CVector3f& Point) const;
00195 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00196 virtual void Print(std::ostream& o) const;
00197 virtual void Compile(std::vector<char>& v, int& i) const;
00198 };
00199
00203 class CSubstraction : public COperation
00204 {
00205 public:
00206 CSubstraction(CValue* pLeftOperand, CValue* pRightOperand);
00207 virtual CValue* GetCopy() const;
00208 virtual float Compute(const CVector3f& Point) const;
00209 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00210 virtual void Print(std::ostream& o) const;
00211 virtual void Compile(std::vector<char>& v, int& i) const;
00212 };
00213
00217 class CProduct : public COperation
00218 {
00219 public:
00220 CProduct(CValue* pLeftOperand, CValue* pRightOperand);
00221 virtual CValue* GetCopy() const;
00222 virtual float Compute(const CVector3f& Point) const;
00223 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00224 virtual void Print(std::ostream& o) const;
00225 virtual void Compile(std::vector<char>& v, int& i) const;
00226 };
00227
00231 class CDivision : public COperation
00232 {
00233 public:
00234 CDivision(CValue* pLeftOperand, CValue* pRightOperand);
00235 virtual CValue* GetCopy() const;
00236 virtual float Compute(const CVector3f& Point) const;
00237 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00238 virtual void Print(std::ostream& o) const;
00239 virtual void Compile(std::vector<char>& v, int& i) const;
00240 };
00241
00245 class COpposite : public COperation
00246 {
00247 public:
00248 COpposite(CValue* pLeftOperand);
00249 virtual CValue* GetCopy() const;
00250 virtual float Compute(const CVector3f& Point) const;
00251 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00252 virtual void Print(std::ostream& o) const;
00253 virtual void Compile(std::vector<char>& v, int& i) const;
00254 };
00255
00256
00260 class CSqrt : public COperation
00261 {
00262 public:
00263 CSqrt(CValue* pLeftOperand);
00264 virtual CValue* GetCopy() const;
00265 virtual float Compute(const CVector3f& Point) const;
00266 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00267 virtual void Print(std::ostream& o) const;
00268 virtual void Compile(std::vector<char>& v, int& i) const;
00269 };
00270
00274 class CSin : public COperation
00275 {
00276 public:
00277 CSin(CValue* pLeftOperand);
00278 virtual CValue* GetCopy() const;
00279 virtual float Compute(const CVector3f& Point) const;
00280 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00281 virtual void Print(std::ostream& o) const;
00282 virtual void Compile(std::vector<char>& v, int& i) const;
00283 };
00284
00288 class CCos : public COperation
00289 {
00290 public:
00291 CCos(CValue* pLeftOperand);
00292 virtual CValue* GetCopy() const;
00293 virtual float Compute(const CVector3f& Point) const;
00294 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00295 virtual void Print(std::ostream& o) const;
00296 virtual void Compile(std::vector<char>& v, int& i) const;
00297 };
00298
00302 class CTan : public COperation
00303 {
00304 public:
00305 CTan(CValue* pLeftOperand);
00306 virtual CValue* GetCopy() const;
00307 virtual float Compute(const CVector3f& Point) const;
00308 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00309 virtual void Print(std::ostream& o) const;
00310 virtual void Compile(std::vector<char>& v, int& i) const;
00311 };
00312
00316 class CExp : public COperation
00317 {
00318 public:
00319 CExp(CValue* pLeftOperand);
00320 virtual CValue* GetCopy() const;
00321 virtual float Compute(const CVector3f& Point) const;
00322 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00323 virtual void Print(std::ostream& o) const;
00324 virtual void Compile(std::vector<char>& v, int& i) const;
00325 };
00326
00330 class CLn : public COperation
00331 {
00332 public:
00333 CLn(CValue* pLeftOperand);
00334 virtual CValue* GetCopy() const;
00335 virtual float Compute(const CVector3f& Point) const;
00336 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00337 virtual void Print(std::ostream& o) const;
00338 virtual void Compile(std::vector<char>& v, int& i) const;
00339 };
00340
00344 class CPow : public COperation
00345 {
00346 public:
00347 CPow(CValue* pLeftOperand, CValue* pRightOperand);
00348 virtual CValue* GetCopy() const;
00349 virtual float Compute(const CVector3f& Point) const;
00350 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00351 virtual void Print(std::ostream& o) const;
00352 virtual void Compile(std::vector<char>& v, int& i) const;
00353 };
00354
00355
00356
00362 class CVariable : public CValue
00363 {
00364 public:
00365 CVariable(TYPE_VARIABLE Type);
00366 virtual CValue* GetCopy() const;
00367 virtual float Compute(const CVector3f& Point) const;
00368 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00369 virtual void Print(std::ostream& o) const;
00370 virtual void Compile(std::vector<char>& v, int& i) const;
00371
00372 private:
00373 TYPE_VARIABLE m_Type;
00374 };
00375
00376
00380 class CNumber : public CValue
00381 {
00382 public:
00383 CNumber(float Number);
00384 virtual CValue* GetCopy() const;
00385 virtual float Compute(const CVector3f& Point) const;
00386 virtual CValue* Derive(TYPE_VARIABLE Type) const;
00387 virtual void Print(std::ostream& o) const;
00388 virtual void Compile(std::vector<char>& v, int& i) const;
00389
00394 virtual bool IsConstant(float* pNumber = NULL) const
00395 {
00396 if (pNumber)
00397 *pNumber = m_Number;
00398
00399 return true;
00400 }
00401
00402 protected:
00408 virtual bool IsMultAbsorbElem() const { return m_Number == 0; }
00409
00415 virtual bool IsMultNeutralElem() const { return m_Number == 1; }
00416
00422 virtual bool IsAddNeutralElem() const { return m_Number == 0; }
00423
00424 private:
00425 float m_Number;
00426 };
00427
00428
00429 #endif // COMPUTE_H
00430