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 #ifndef GENERGYH
00027 #define GENERGYH
00028
00029 #include <qmutex.h>
00030
00031 namespace GCS
00032 {
00033
00069 class GEnergy : public QMutex
00070 {
00071 protected:
00072
00081 double Level;
00082
00088 double Amount;
00089
00101 double Sigma;
00102
00103
00104 public:
00105
00109 GEnergy()
00110 : Level(0),
00111 Amount(0),
00112 Sigma(0)
00113 {}
00114
00118 GEnergy(double level, double amount, double sigma)
00119 : Level(level),
00120 Amount(amount),
00121 Sigma(sigma)
00122 {}
00123
00127 GEnergy(const GEnergy& original)
00128 : QMutex(),
00129 Level(original.Level),
00130 Amount(original.Amount),
00131 Sigma(original.Sigma)
00132 {}
00133
00134
00142 virtual ~GEnergy()
00143 {}
00144
00148 double level() const {return Level;}
00149
00153 double amount() const {return Amount;}
00154
00158 double sigma() const {return Sigma;}
00159
00163 void set(double level, double amount, double sigma)
00164 {
00165 this->Level = level;
00166 this->Amount = amount;
00167 this->Sigma = sigma;
00168 }
00169
00173 void set(const GEnergy original)
00174 {
00175 set(original.Level,original.Amount,original.Sigma);
00176 }
00177
00181 void operator = (const GEnergy& original)
00182 {
00183 set(original);
00184 }
00185
00192 GEnergy take(double fraction)
00193 {
00194 if (fraction>1)
00195 fraction=1;
00196 double difference = Amount*fraction;
00197 Amount -=difference;
00198 return GEnergy(Level,difference,Sigma);
00199 }
00200
00208 void put(GEnergy& energy)
00209 {
00210 if (energy.Amount<0)
00211 return;
00212
00213 double fraction = energy.Amount / (this->Amount + energy.Amount);
00214 double d_Level = energy.Level - this->Level;
00215 double d_Sigma = energy.Sigma - this->Sigma;
00216
00217 this->Amount += energy.Amount;
00218 this->Level += d_Level*fraction;
00219
00220
00221 double d_Level_abs = d_Level;
00222 if (d_Level_abs<0)
00223 d_Level_abs = -d_Level_abs;
00224 this->Sigma += (d_Sigma + d_Level_abs)*fraction;
00225
00226
00227 energy.Level = this->Level;
00228 energy.Amount = 0;
00229 energy.Sigma = this->Sigma;
00230 }
00231 };
00232
00233
00234 }
00235
00236 #endif