00001
00006 #include "Generator.h"
00007
00008
00015 Generator::Generator(){
00016 clear();
00017 spur_ = 0;
00018 }
00019
00020
00030 Generator::Generator( Spur* spur, long int id ){
00031 clear();
00032 spur_ = spur;
00033 idBenutzer_ = id;
00034 }
00035
00042 void Generator::clear(){
00043 letzteErstellungszeit_ = 0;
00044 aktuelleAnzahlFahrzeuge_ = 0;
00045 anzahlFahrzeuge_ = 0;
00046 loescheMich_ = 0;
00047 zufallsFlag_ = 1;
00048 idBenutzer_ = 0;
00049
00050 fahrzeugTyp_ = 2;
00051 fahrzeugBeschleunigungPositiv_ = 3;
00052 fahrzeugBeschleunigungNegativ_ = 7.5;
00053 fahrzeugLebensdauer_ = -1;
00054 fahrzeugLaenge_ = 3.5;
00055 fahrzeugHoechstgeschwindigkeit_ = 200;
00056 fahrzeugFahrtenbuch_ = 0;
00057 fahrzeugAnzahlWegpunkte_ = 0;
00058 }
00059
00069 void Generator::takt(double zeitintervall){
00070 letzteErstellungszeit_ = letzteErstellungszeit_ + zeitintervall;
00071 if( letzteErstellungszeit_ < taktZeit_ ){
00072
00073 }
00074 else{
00075 if( aktuelleAnzahlFahrzeuge_ >= anzahlFahrzeuge_ ){
00076 loescheMich_ = 1;
00077 return;
00078 }
00079
00080 if( zufallsFlag_ == 1 ){
00081 zufall();
00082 }
00083 try{
00084 erstelleFahrzeug();
00085 }
00086 catch( Fehler *fehler ){
00087 throw( fehler );
00088 }
00089 letzteErstellungszeit_ = 0;
00090 aktuelleAnzahlFahrzeuge_ ++;
00091 }
00092 }
00093
00100 void Generator::aufraeumen(){
00101 }
00102
00103
00115 int Generator::zufallszahl( int minimum, int maximum ){
00116 srand((unsigned)time(NULL));
00117 int zahl(0);
00118
00119 if( minimum >= maximum ){
00120 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDer Zufallsgenerator kann nur mit einem Minimum kleiner als dem Maximum einen sinnvolen Wert ermitteln.");
00121 throw(fehler);
00122 }
00123
00124 do{
00125 zahl = rand()%(maximum+1-minimum);
00126 zahl += minimum;
00127 }while( zahl < minimum || zahl > maximum );
00128
00129 return zahl;
00130 }
00131
00140 void Generator::wegpunktHinzufuegen( int richtung ){
00141 int *tmp(0);
00142 int i(0);
00143
00144 if( fahrzeugFahrtenbuch_ == 0 ){
00145 fahrzeugFahrtenbuch_ = new int[1];
00146 fahrzeugFahrtenbuch_[0] = richtung;
00147 fahrzeugAnzahlWegpunkte_ = 1;
00148 }
00149
00150 else{
00151 tmp = fahrzeugFahrtenbuch_;
00152 fahrzeugFahrtenbuch_ = 0;
00153
00154 fahrzeugFahrtenbuch_ = new int[(fahrzeugAnzahlWegpunkte_+1)];
00155
00156 for( i = 0; i < fahrzeugAnzahlWegpunkte_; i++ ){
00157 fahrzeugFahrtenbuch_[i] = tmp[i];
00158 }
00159
00160 fahrzeugAnzahlWegpunkte_++;
00161 fahrzeugFahrtenbuch_[fahrzeugAnzahlWegpunkte_-1] = richtung;
00162
00163 delete tmp;
00164 }
00165 }
00166
00175 void Generator::setzeAnzahlFahrzeuge(int anzahl){
00176 anzahlFahrzeuge_ = anzahl;
00177 aktuelleAnzahlFahrzeuge_ = 0;
00178 }
00179
00195 void Generator::setzeFahrzeugeigenschaften(int typ, double beschleunigungPositiv, double beschleunigungNegativ, int lebensdauer, double laenge, Koordinaten farbe, double hoechstgeschwindigkeit ){
00196 if( typ < 1 || typ > 4 ){
00197 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDer Typ fuer Fahrzeuge in einem Generator entspricht nicht den geforderten Parametern.");
00198 throw(fehler);
00199 }
00200 fahrzeugTyp_ = typ;
00201 fahrzeugBeschleunigungPositiv_ = beschleunigungPositiv;
00202 fahrzeugBeschleunigungNegativ_ = beschleunigungNegativ;
00203 fahrzeugLebensdauer_ = lebensdauer;
00204 fahrzeugFarbe_ = farbe;
00205 fahrzeugLaenge_ = laenge;
00206 fahrzeugHoechstgeschwindigkeit_ = hoechstgeschwindigkeit;
00207
00208 zufallsFlag_ = 0;
00209 }
00210
00219 void Generator::setzeTaktZeit( double zeitintervall ){
00220 taktZeit_ = zeitintervall;
00221 }
00222
00231 long int Generator::gibId(){
00232 return id_;
00233 }
00234
00235
00244 int Generator::gibAnzahlFahrzeuge(){
00245 return anzahlFahrzeuge_;
00246 }
00247
00256 int Generator::gibAktuelleAnzahlFahrzeuge(){
00257 return aktuelleAnzahlFahrzeuge_;
00258 }
00259
00268 bool Generator::sollEntferntWerden(){
00269 return loescheMich_;
00270 }
00271
00278 void Generator::zufall(){
00279 int rgb(0), farbe(0);
00280
00281
00282 fahrzeugTyp_ = zufallszahl( 1, 4 );
00283
00284 switch( fahrzeugTyp_ ){
00285 case BIKE:{
00286 fahrzeugHoechstgeschwindigkeit_ = zufallszahl( 200, 360 );
00287 fahrzeugBeschleunigungPositiv_ = (double) zufallszahl( 70, 93 ) / 10;
00288 fahrzeugBeschleunigungNegativ_ = (double) zufallszahl( 70, 100 ) / -10;
00289 fahrzeugLaenge_ = (double) zufallszahl( 13, 25 ) / 10;
00290 break;
00291 }
00292 case PKW:{
00293 fahrzeugHoechstgeschwindigkeit_ = zufallszahl( 170, 250 );
00294 fahrzeugBeschleunigungPositiv_ = (double) zufallszahl( 19, 35 ) / 10;
00295 fahrzeugBeschleunigungNegativ_ = (double) zufallszahl( 60, 75 ) / -10;
00296 fahrzeugLaenge_ = (double) zufallszahl( 25, 50 ) / 10;
00297 break;
00298 }
00299 case LKW:{
00300 fahrzeugHoechstgeschwindigkeit_ = zufallszahl( 70, 90 );
00301 fahrzeugBeschleunigungPositiv_ = (double) zufallszahl( 13, 14 ) / 10;
00302 fahrzeugBeschleunigungNegativ_ = (double) zufallszahl( 45, 55 ) / -10;
00303 fahrzeugLaenge_ = (double) zufallszahl( 6, 12 );
00304 break;
00305 }
00306 case BUS:{
00307 fahrzeugHoechstgeschwindigkeit_ = zufallszahl( 80, 130 );
00308 fahrzeugBeschleunigungPositiv_ = (double) zufallszahl( 15, 16 ) / 10;
00309 fahrzeugBeschleunigungNegativ_ = (double) zufallszahl( 45, 55 ) / -10;
00310 fahrzeugLaenge_ = (double) zufallszahl( 6, 10 );
00311 break;
00312 }
00313 }
00314
00315 rgb = zufallszahl( 0, 2 );
00316 if( rgb == 0 ){
00317 fahrzeugFarbe_.x = zufallszahl( 150, 255 );
00318 fahrzeugFarbe_.y = 0;
00319 fahrzeugFarbe_.z = 0;
00320 }
00321 else if( rgb == 1 ){
00322 fahrzeugFarbe_.x = 0;
00323 fahrzeugFarbe_.y = zufallszahl( 150, 255 );
00324 fahrzeugFarbe_.z = 0;
00325 }
00326 else{
00327 fahrzeugFarbe_.x = 0;
00328 fahrzeugFarbe_.y = 0;
00329 fahrzeugFarbe_.z = zufallszahl( 150, 255 );
00330 }
00331
00332 fahrzeugLebensdauer_ = zufallszahl( -1, 1000 );
00333 }
00334
00342 void Generator::erstelleFahrzeug(){
00343 Fahrzeug *fahrzeug;
00344 try{
00345 fahrzeug = new Fahrzeug( fahrzeugTyp_, fahrzeugLaenge_, fahrzeugFarbe_,
00346 fahrzeugBeschleunigungPositiv_, fahrzeugBeschleunigungNegativ_,
00347 fahrzeugHoechstgeschwindigkeit_, spur_, fahrzeugLebensdauer_ );
00348 if( fahrzeugFahrtenbuch_ != 0 ){
00349 fahrzeug->setzeFahrtenbuch( fahrzeugFahrtenbuch_, fahrzeugAnzahlWegpunkte_ );
00350 }
00351 fahrzeugliste_->datenHinzufuegen( fahrzeug );
00352 }
00353 catch( Fehler *fehler ){
00354 throw( fehler );
00355 }
00356 }
00357
00366 void Generator::setzeFahrzeugliste( Liste *fahrzeugliste ){
00367 fahrzeugliste_ = fahrzeugliste;
00368 }
00369
00370
00371
00372
00373
00374
00375
00376
00377 void Generator::inString( ){
00378 cout << this;
00379 }
00380
00390 ostream &operator<< ( ostream &os, Generator *generator ){
00391 os << "----------Generator----------" << endl;
00392 os << "ID: " << generator->id_ << endl;
00393 os << "Erstellzeit: " << generator->taktZeit_ << endl;
00394 os << "noch erstllende Fzg: " << generator->anzahlFahrzeuge_ - generator->aktuelleAnzahlFahrzeuge_ << endl;
00395
00396 return os;
00397 }
00398
00407 void Generator::exportieren( string cvsDateiname ){
00408
00409
00410
00411 }