00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _ENGINE_H_
00022 #define _ENGINE_H_
00023
00024 #include <vamos/geometry/Conversions.h>
00025 #include <vamos/geometry/Spline.h>
00026 #include <vamos/geometry/Two_Point.h>
00027 #include <vamos/body/Particle.h>
00028
00029 namespace Vamos_Body
00030 {
00031
00032
00033
00034 class Engine : public Particle
00035 {
00036
00037 double m_max_power;
00038
00039
00040 double m_peak_engine_speed;
00041
00042
00043 double m_engine_speed_limit;
00044
00045
00046 double m_inertia;
00047
00048
00049 double m_idle_throttle;
00050
00051
00052 double m_start_speed;
00053
00054
00055
00056 double m_stall_speed;
00057
00058
00059 double m_fuel_consumption;
00060
00061
00062 double m_rotational_speed;
00063
00064 double m_last_rotational_speed;
00065
00066
00067 double m_gas;
00068
00069
00070 double m_drag;
00071
00072 double m_transmission_speed;
00073
00074
00075 bool m_out_of_gas;
00076
00077
00078 double m_idle;
00079
00080
00081 double m_drive_torque;
00082
00083
00084 double m_drive_impulse;
00085
00086
00087 bool m_engaged;
00088
00089
00090
00091 double torque_map (double gas, double rotational_speed);
00092
00093 Vamos_Geometry::Spline m_torque_curve;
00094
00095 double m_friction;
00096
00097
00098 public:
00099
00100
00101
00102 Engine (double mass, const Vamos_Geometry::Three_Vector& position,
00103 double max_power,
00104 double peak_engine_rpm,
00105 double rpm_limit,
00106 double inertia,
00107 double idle_throttle,
00108 double start_rpm,
00109 double stall_rpm,
00110 double fuel_consumption);
00111
00112 void set_torque_curve (const std::vector <Vamos_Geometry::Two_Point>&
00113 torque_points);
00114
00115 void set_friction (double friction) { m_friction = friction; }
00116
00117
00118
00119
00120
00121
00122 void input (double gas, double drag, double transmission_speed,
00123 bool engaged);
00124
00125 void find_forces ();
00126
00127
00128 void propagate (double time);
00129
00130 void rewind ();
00131
00132
00133 double rotational_speed () const { return m_rotational_speed; }
00134
00135
00136 double max_rotational_speed () const { return m_engine_speed_limit; }
00137
00138 double peak_engine_speed () const { return m_peak_engine_speed; }
00139
00140
00141 double drive_torque () const { return m_drive_torque; }
00142
00143 double drive_impulse () const { return m_drive_impulse; }
00144
00145 double throttle () const { return m_gas; }
00146
00147
00148 double fuel_rate () const
00149 { return m_fuel_consumption * m_rotational_speed * m_gas; }
00150
00151
00152 void out_of_gas (bool out) { m_out_of_gas = out; }
00153
00154
00155 void start () { speed (m_start_speed); }
00156
00157
00158
00159 void speed (double speed_in);
00160
00161 void set_rotational_speed(double newrs) {m_rotational_speed = newrs; m_last_rotational_speed = newrs;}
00162 double drag() {return m_drag;}
00163 void set_drag(double newdrag) {m_drag = newdrag;}
00164
00165 double max_power() {return m_max_power;}
00166
00167 double stall_speed() {return m_stall_speed;}
00168 };
00169 }
00170
00171 #endif // !_ENGINE_H_