compute.h

Go to the documentation of this file.
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 

Generated on Fri Dec 5 03:20:33 2008 for Mathematical Ray-tracer by  doxygen 1.5.4