Benutzer:Ntr0pY/OpenGLwxWidgets
aus Wikipedia, der freien Enzyklopädie
Hier mal das Sample für die Datenberechnung. Allerdings ist der Spritverbrauch noch nicht eingerechnet...
Data Racecar::calculateCurrentData(clock_t actTime) {
// calculate time delta double deltaTime = (actTime - lastTime) / 1000.0; double meters_time_intervall = 0; double sic_currentSpeed=currentSpeed; double brakingFinish; double brakingDistance; double acc = acceleration; double kmh;
if (meters > 1371 ) { brakingFinish = 2271; accAfterTurn = 2742; } else { brakingFinish = 900; accAfterTurn = 1371; }
if ( pitstop == false ) { if ( currentSpeed > turnInVelocity) { brakingDistance = (turnInVelocity*turnInVelocity - currentSpeed*currentSpeed) / (2*decceleration); if ((meters+brakingDistance) > brakingFinish && meters < accAfterTurn) { acc = decceleration; cout<<"BREAK!"<<endl; } } currentSpeed = currentSpeed + acc * deltaTime;
if (currentSpeed > maximumSpeed) { cout<<"maximumSpeed!"<<endl; currentSpeed = maximumSpeed; meters = meters + (currentSpeed * deltaTime); } else { meters_time_intervall = ((currentSpeed*currentSpeed - sic_currentSpeed*sic_currentSpeed)) / (2*acc); meters = (meters + meters_time_intervall); }; if (meters > brakingFinish && meters <= accAfterTurn) { cout<<"constant Speed!"<<endl; currentSpeed = turnInVelocity; meters = meters + (currentSpeed * deltaTime); } if (meters > roundLength) { meters = meters - roundLength; currentRound = currentRound + 1; }
} else { // PITSTOP if (currentSpeed > pitlaneMaxV ) { cout<<"BRAKE FOR PIT!"<<endl; // brake acc = decceleration; currentSpeed = currentSpeed + acc * deltaTime; meters_time_intervall = ((pitlaneMaxV*pitlaneMaxV - currentSpeed*currentSpeed)) / (2*acc); meters = (meters + meters_time_intervall); } else { if (meters < 200) { cout<<"DRIVE IN PIT!"<<endl; // const up to 200m currentSpeed = pitlaneMaxV; meters = meters + (currentSpeed * deltaTime); } else { // brake to 0 if (currentSpeed > 0) { cout<<"PITSTOP!"<<endl; acc = decceleration; currentSpeed = currentSpeed + acc * deltaTime; meters_time_intervall = ((0 - currentSpeed*currentSpeed)) / (2*acc); meters = (meters + meters_time_intervall); } else { cout<<"REFUEL!"<<endl; currentSpeed = 0; if (waitTime == 0) { waitTime = actTime + (refuel * 250); } if ( actTime > waitTime ) { cout<<"GO GO GO!"<<endl; // go, go, go pitstop = false; waitTime = 0; } } } } } // only for debug kmh = currentSpeed * 3.6; cout.precision(5); cout<<"actTime: "<<actTime<<" / lastTime: "<<lastTime<<endl; cout<<"deltaTime: "<<deltaTime<<" / deltaMeters: "<<meters_time_intervall<<endl; cout<<"current Speed: "<<currentSpeed<<" / meters: "<<meters<<endl; cout<<"current Speed km/h : "<<kmh<<endl; cout<<endl; // debug end lastTime=actTime;
return (Data(currentSpeed, meters, currentFuel, currentRound, pitstop));
}