00001
00006 #include "Fehler.h"
00007 #include "Konstanten.h"
00008 #include "Spur.h"
00009 class Fahrzeug;
00010
00017 Spur::Spur( ){
00018 clear();
00019 }
00020
00021
00032 Spur::Spur( long int id, double laenge, int maximalGeschwindigkeit){
00033 clear();
00034 id_ = id;
00035 laenge_ = laenge;
00036 maximalGeschwindigkeit_ = maximalGeschwindigkeit;
00037 }
00038
00039
00048 int Spur::gibAnzahlFahrzeuge( ){
00049 return anzahlFahrzeuge_;
00050 }
00051
00062 int Spur::gibAnzahlAbgefahrenerFahrzeuge( int typ ){
00063 int anzahl;
00064 if( typ > 0 && typ < 5 ){
00065 anzahl = statistik_[typ-1];
00066 statistik_[typ-1] = 0;
00067 }
00068 else if( typ == 0 ){
00069 anzahl = statistik_[0] + statistik_[1] + statistik_[2] + statistik_[3];
00070 statistik_[0] = 0;
00071 statistik_[1] = 0;
00072 statistik_[2] = 0;
00073 statistik_[3] = 0;
00074 }
00075 else{
00076 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDer Typ eines Fahrzeuges liegt ausserhalb der Grenzen.");
00077 throw(fehler);
00078 }
00079
00080 return anzahl;
00081 }
00082
00093 int Spur::gibEndzustand( ){
00094 return endzustand_;
00095 }
00096
00097
00109 void Spur::setzeEndzustand(int zustand){
00110 if( zustand >= 0 && zustand < 4 ){
00111 endzustand_ = zustand;
00112 }
00113 else{
00114 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDas Endeflag fuer eine Spur einspricht nicht den Vorgaben.");
00115 throw(fehler);
00116 }
00117 }
00118
00119
00120
00132 void Spur::setzeNaechstesVerbindungselement(Spur *spur, int richtung, double wahrscheinlichkeit){
00133 if( richtung > 0 && richtung < 4 && wahrscheinlichkeit <= 1 && wahrscheinlichkeit >= 0 ){
00134 spur_[richtung-1] = spur;
00135 wahrscheinlichkeit_[richtung-1] = wahrscheinlichkeit;
00136 spur->setzeAbbiegerichtung( richtung );
00137 setzeGruen();
00138 }
00139 else{
00140 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDie Wahrscheinlichkeit fuer eine nicht existierende Richtung sollte gesetzt werden.");
00141 throw(fehler);
00142 }
00143 }
00144
00145
00158 double Spur::gibWahrscheinlichkeit(int richtung){
00159 if( richtung > 0 && richtung < 4 ){
00160 return wahrscheinlichkeit_[richtung-1];
00161 }
00162 else{
00163 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDie Wahrscheinlichkeit fuer eine nicht existierende Richtung wurde abgefragt.");
00164 throw(fehler);
00165 }
00166 return 0;
00167 }
00168
00169
00179 void Spur::anmelden(Fahrzeug *fahrzeug){
00180 if( anzahlFahrzeuge_ < 1000){
00181 fahrzeugListe_[anzahlFahrzeuge_] = fahrzeug;
00182 anzahlFahrzeuge_++;
00183 }
00184 else{
00185 Fehler *fehler = new Fehler("Auf einer Spur befinden sich mehr als 1000 Fahrzeuge.");
00186 throw( fehler );
00187 }
00188 }
00189
00190
00200 void Spur::abmelden(Fahrzeug *fahrzeug){
00201 int position(0), i(0);
00202
00203
00204 if( fahrzeugListe_[0] != 0 && fahrzeugListe_[0]->gibId() == fahrzeug->gibId() ){
00205 position = 0;
00206 }
00207 else{
00208
00209 for( position = 0; position < 1000; position++){
00210 if( fahrzeugListe_[position] != 0 && fahrzeugListe_[position]->gibId() == fahrzeug->gibId() ){
00211 break;
00212 }
00213 }
00214
00215 Fehler *fehler = new Fehler("Aus einer Spur soll ein dort nicht befindliches Fahrzeug geloescht werden.");
00216 throw( fehler );
00217 }
00218
00219
00220 for( i = position; i < 999; i++ ){
00221 fahrzeugListe_[i] = fahrzeugListe_[i+1];
00222 }
00223 fahrzeugListe_[999] = 0;
00224
00225 anzahlFahrzeuge_--;
00226
00227
00228 statistik_[fahrzeug->gibTyp()-1]++;
00229 }
00230
00231
00240 double Spur::gibLaenge(){
00241 return laenge_;
00242 }
00243
00253 Fahrzeug* Spur::gibVorgaenger(Fahrzeug *fahrzeug){
00254 int position(0);
00255
00256 for( position = 0; position < anzahlFahrzeuge_; position++){
00257 if( fahrzeugListe_[position]->gibId() == fahrzeug->gibId() ){
00258 if( position > 0 ){
00259 return fahrzeugListe_[position-1];
00260 }
00261 }
00262 }
00263
00264 return 0;
00265 }
00266
00275 Fahrzeug* Spur::gibLetztes(){
00276 if( anzahlFahrzeuge_ > 1 ){
00277 return fahrzeugListe_[anzahlFahrzeuge_-1];
00278 }
00279 else{
00280 return 0;
00281 }
00282 }
00283
00292 long int Spur::gibId(){
00293 return id_;
00294 }
00295
00296
00306 Spur *Spur::gibNaechsteSpur(int richtung){
00307 if( richtung > 0 && richtung < 4 && spur_[richtung-1] != 0 ){
00308 return spur_[richtung-1];
00309 }
00310 else{
00311 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDie gewuenschte Spur existiert nicht.");
00312 throw(fehler);
00313 }
00314 }
00315
00316
00325 double Spur::gibMaximaleGeschwindigkeit(){
00326 return maximalGeschwindigkeit_;
00327 }
00328
00329
00336 void Spur::clear(){
00337 int i(0);
00338 for( i=0; i<1000; i++){
00339 fahrzeugListe_[i] = 0;
00340 }
00341 for( i = 0; i<4; i++ ){
00342 statistik_[i] = 0;
00343 }
00344
00345 wahrscheinlichkeit_[0] = 0;
00346 wahrscheinlichkeit_[1] = 0;
00347 wahrscheinlichkeit_[2] = 0;
00348 spur_[0] = 0;
00349 spur_[1] = 0;
00350 spur_[2] = 0;
00351 nachfolger_[0] = 0;
00352 nachfolger_[1] = 0;
00353 nachfolger_[2] = 0;
00354 maximalGeschwindigkeit_ = 50;
00355 laenge_ = 300;
00356 endzustand_ = STOP;
00357 anzahlFahrzeuge_ = 0;
00358 abbiegerichtung_ = NICHTS;
00359 richtung_ = MITTE;
00360 }
00361
00362
00369 void Spur::setzeGruen(){
00370 setzeEndzustand(GRUEN);
00371 }
00372
00373
00380 void Spur::setzeGelb(){
00381 setzeEndzustand(GELB);
00382 }
00383
00384
00391 void Spur::setzeRot(){
00392 setzeEndzustand(ROT);
00393 }
00394
00395
00402 void Spur::setzeSackgasse(){
00403 setzeEndzustand(STOP);
00404 }
00405
00406
00415 bool Spur::istGruen(){
00416 if( gibEndzustand() == GRUEN )
00417 return 1;
00418 else
00419 return 0;
00420 }
00421
00422
00431 bool Spur::istGelb(){
00432 if( gibEndzustand() == GELB )
00433 return 1;
00434 else
00435 return 0;
00436 }
00437
00438
00447 bool Spur::istRot(){
00448 if( gibEndzustand() == ROT )
00449 return 1;
00450 else
00451 return 0;
00452 }
00453
00454
00463 bool Spur::istSackgasse(){
00464 if( gibEndzustand() == STOP )
00465 return 1;
00466 else
00467 return 0;
00468 }
00469
00478 Koordinaten Spur::gibKoordinaten(){
00479 return koordinaten_;
00480 }
00481
00490 void Spur::setzeKoordinaten( Koordinaten koordinaten ){
00491 koordinaten_ = koordinaten;
00492 }
00493
00502 int Spur::gibAusrichtung(){
00503 return ausrichtung_;
00504 }
00505
00514 void Spur::setzeAusrichtung( int ausrichtung ){
00515 ausrichtung_ = ausrichtung;
00516 }
00517
00526 int Spur::gibRichtung(){
00527 return richtung_;
00528 }
00529
00538 void Spur::setzeRichtung( int richtung ){
00539 richtung_ = richtung;
00540 }
00541
00550 int Spur::gibAbbiegerichtung(){
00551 return abbiegerichtung_;
00552 }
00553
00563 void Spur::setzeAbbiegerichtung( int abbiegerichtung ){
00564 if( abbiegerichtung > 0 && abbiegerichtung < 4){
00565 abbiegerichtung_ = abbiegerichtung;
00566 }
00567 else{
00568 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nEs soll eine Abbiegerichtung gesetzt werden, die nicht moeglich ist.");
00569 throw(fehler);
00570 }
00571
00572 }
00573
00583 long int Spur::gibNachfolgerId(int richtung){
00584 if( richtung > 0 && richtung < 4 && nachfolger_[richtung-1] != 0){
00585 return nachfolger_[richtung-1];
00586 }
00587 else{
00588 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDie Richtung eines Nachfolgers ist ausserhalb der zulaessigen Parameter.");
00589 throw(fehler);
00590 }
00591 }
00592
00604 void Spur::setzeNaechstesVerbindungselement(int richtung, long int id, double wahrscheinlichkeit){
00605 if( richtung > 0 && richtung < 4 && wahrscheinlichkeit <= 1 && wahrscheinlichkeit >= 0 ){
00606 nachfolger_[richtung-1] = id;
00607 wahrscheinlichkeit_[richtung-1] = wahrscheinlichkeit;
00608 }
00609 else{
00610 Fehler *fehler = new Fehler("Parameter ausserhalb zulaessiger Grenzen.\nDie Richtung eines Nachfolgers ist ausserhalb der zulaessigen Parameter.");
00611 throw(fehler);
00612 }
00613 }
00614
00621 ostream &operator<< ( ostream &os, Spur *spur ){
00622 os << "----------Spur----------" << endl;
00623 os << "ID: " << spur->id_ << endl;
00624 os << "Endzustand: " << spur->endzustand_ << "( 1 = gruen | 2 = gelb | 3 = rot | 0 = sackgasse )" << endl;
00625 os << "Laenge: " << spur->laenge_ << " m" << endl;
00626 os << "max. Geschwindigkeit: " << spur->maximalGeschwindigkeit_ << " km/h" << endl;
00627 os << "p fuer links: " << spur->wahrscheinlichkeit_[0] << endl;
00628 os << "p fuer gerade: " << spur->wahrscheinlichkeit_[1] << endl;
00629 os << "p fuer rechts: " << spur->wahrscheinlichkeit_[2] << endl;
00630 os << "Anzahl Fahrzeuge: " << spur->anzahlFahrzeuge_ << endl;
00631 return os;
00632 }