00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __PHYSICS_H__
00021 #define __PHYSICS_H__
00022
00023 #include "config.h"
00024 #include "geometry.h"
00025 #include "DateTime.h"
00026
00027 #include <vector>
00028 #include <iostream>
00029
00034 class IObject
00035 {
00036 public:
00040 struct Position Position()
00041 {
00042 DateTime now( DateTime::Now() );
00043 return ImplPosition(now);
00044 }
00045
00046 struct Position Position( const DateTime& at )
00047 { return ImplPosition( at ); }
00048
00052 double Size()
00053 {
00054 DateTime now( DateTime::Now() );
00055 return ImplSize(now);
00056 }
00057
00058 double Size( const DateTime& at )
00059 { return ImplSize( at ); }
00060
00061 virtual ~IObject() {}
00062
00063 IObject& Serialize( std::ostream& output ) {
00064 ImplSerialize( output );
00065 return *this;
00066 }
00067
00068 IObject& Deserialize( std::istream& input ) {
00069 ImplDeserialize( input );
00070 return *this;
00071 }
00072
00073 protected:
00074 IObject() {}
00075
00076 virtual struct Position ImplPosition( const DateTime& ) =0;
00077 virtual double ImplSize( const DateTime& ) =0;
00078
00079 virtual void ImplSerialize( std::ostream& )=0;
00080 virtual void ImplDeserialize( std::istream& )=0;
00081
00082 private:
00083 IObject( const IObject& );
00084 IObject& operator=( const IObject& );
00085 };
00086
00087 typedef IObject* IObjectPtr;
00088 typedef IObject*const IObjectConstPtr;
00089 typedef STD_VECTOR(IObjectPtr) IObjectContainer;
00090 typedef STD_VECTOR(IObjectPtr) IObjectConstContainer;
00091
00095 class IMovingObject : public virtual IObject
00096 {
00097 public:
00101 double Speed()
00102 {
00103 DateTime now( DateTime::Now());
00104 return ImplSpeed(now);
00105 }
00106
00107 double Speed( const DateTime& at )
00108 { return ImplSpeed( at ); }
00109
00113 double Radius()
00114 {
00115 DateTime now( DateTime::Now() );
00116 return ImplRadius( now );
00117 }
00118
00119 double Radius(const DateTime& at)
00120 { return ImplRadius(at); }
00121
00122 virtual ~IMovingObject() {}
00123
00124 protected:
00125 IMovingObject() {}
00126
00127 virtual double ImplSpeed(const DateTime&) =0;
00128 virtual double ImplRadius(const DateTime&) =0;
00129
00130 private:
00131 IMovingObject( const IMovingObject& );
00132 IMovingObject& operator=( const IMovingObject& );
00133 };
00134
00138 class BaseObject : public virtual IObject
00139 {
00140 public:
00141 BaseObject( double size=.0,
00142 double x=.0,
00143 double y=.0,
00144 double angle=.0 );
00145
00146 BaseObject( double size, const struct Point& point, double angle );
00147 BaseObject( double size, const struct Position& position );
00148
00149 virtual ~BaseObject();
00150
00151 protected:
00152 struct Position ImplPosition(const DateTime&);
00153 double ImplSize(const DateTime&);
00154
00155 void SetPosition( double x, double y, double angle );
00156 void SetPosition( const struct Point& point, double angle );
00157 void SetPosition( const struct Position& position );
00158
00159 void SetSize( double size );
00160
00161 virtual void ImplSerialize( std::ostream& );
00162 virtual void ImplDeserialize( std::istream& );
00163
00164 private:
00165 BaseObject( const BaseObject& rhs );
00166 BaseObject& operator=( const BaseObject& rhs );
00167
00168 struct Members;
00169 Members* pimpl;
00170 };
00171
00175 class BaseMovingObject : public virtual IMovingObject, public virtual BaseObject
00176 {
00177 public:
00178 BaseMovingObject( double speed=.0,
00179 double turn=.0,
00180 double size=.0,
00181 double x=.0,
00182 double y=.0,
00183 double angle=.0 );
00184
00185 BaseMovingObject( double speed, double turn, double size, const struct Point& point, double angle );
00186 BaseMovingObject( double speed, double turn, double size, const struct Position& position );
00187
00188 virtual ~BaseMovingObject();
00189
00190 protected:
00191
00192 double ImplSpeed(const DateTime&) ;
00193 double ImplRadius(const DateTime&) ;
00194
00195 void SetSpeed( double );
00196 void SetRadius( double );
00197
00198 virtual void ImplSerialize( std::ostream& );
00199 virtual void ImplDeserialize( std::istream& );
00200
00201 private:
00202 BaseMovingObject( const BaseMovingObject& rhs );
00203 BaseMovingObject& operator=( const BaseMovingObject& rhs );
00204
00205 struct Members;
00206 Members* pimpl;
00207 };
00208
00213 class IEnviroment
00214 {
00215 public:
00216 typedef std::vector<struct Vector> BorderVector;
00217
00222 struct Point RightTop() const {
00223 return ImplRightTop();
00224 }
00225
00229 const IObjectConstContainer& Objects() const {
00230 return ImplObjects();
00231 }
00232
00233 const BorderVector& Borders() const {
00234 return ImplBorders();
00235 }
00236
00237 virtual ~IEnviroment() {}
00238
00239 protected:
00240 virtual struct Point ImplRightTop() const =0;
00241 virtual const IObjectConstContainer& ImplObjects() const =0;
00242 virtual const BorderVector& ImplBorders() const =0;
00243 };
00244
00248 class PhysicsEngine
00249 {
00250 public:
00257 double TimeToCollision( IMovingObject& mobj, IObject& sobj ) const {
00258 return ImplTimeToCollision(mobj,sobj);
00259 }
00260
00268 PointsVector CollisionPoints( IMovingObject& mobj, IObject& sobj ) const {
00269 return ImplCollisionPoints(mobj,sobj);
00270 }
00271
00277 Position PositionAfterTime( IMovingObject& mobj, double time ) const {
00278 return ImplPositionAfterTime( mobj, time );
00279 }
00280
00286 Point PositionAtTime( IMovingObject& mobj, const DateTime& time ) const {
00287 return ImplPositionAtTime( mobj, time );
00288 }
00289
00295 double DistanceAfterTime( IMovingObject& mobj, double time ) const {
00296 return ImplDistanceAfterTime( mobj, time );
00297 }
00298
00304 double DistanceAtTime( IMovingObject& mobj, const DateTime& time ) const {
00305 return ImplDistanceAtTime( mobj, time );
00306 }
00307
00314 double TimeToDistance( IMovingObject& mobj, double distance ) const {
00315 return ImplTimeToDistance( mobj, distance );
00316 }
00317
00324 DateTime TimeAfterDistance( IMovingObject& mobj, double distance, const DateTime& now ) const {
00325 return ImplTimeAfterDistance( mobj, distance, now );
00326 }
00327
00328 double TimeToPoint( IMovingObject& mobj, struct Point point ) const {
00329 return ImplTimeToPoint( mobj, point );
00330 }
00331
00332 double GetCollisionTime( IMovingObject& obj, IMovingObject& reference, Point& collPoint ) const {
00333 return ImplGetCollTime( obj, reference, collPoint );
00334 }
00335
00336 virtual ~PhysicsEngine() {};
00337
00338 protected:
00339 virtual double ImplTimeToCollision( IMovingObject& mobj, IObject& sobj ) const =0;
00340 virtual PointsVector ImplCollisionPoints( IMovingObject& mobj, IObject& sobj ) const =0;
00341 virtual Position ImplPositionAfterTime( IMovingObject& mobj, double time ) const =0;
00342 virtual Point ImplPositionAtTime( IMovingObject& mobj, const DateTime& time ) const =0;
00343 virtual double ImplDistanceAfterTime( IMovingObject& mobj, double time ) const =0;
00344 virtual double ImplDistanceAtTime( IMovingObject& mobj, const DateTime& time ) const =0;
00345 virtual double ImplTimeToDistance( IMovingObject& mobj, double distance ) const =0;
00346 virtual DateTime ImplTimeAfterDistance( IMovingObject& mobj, double distance, const DateTime& now ) const =0;
00347 virtual double ImplTimeToPoint( IMovingObject& mobj, struct Point point ) const =0;
00348 virtual double ImplGetCollTime( IMovingObject& obj, IMovingObject& reference, Point& collPoint ) const =0;
00349 };
00350
00351 #endif
00352