physics.h

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2008 Jakub Filak <xfilak01@stud.fit.vutbr.cz>
00003  *
00004  * This file is part of rob08
00005  *
00006  * rob08 is free software: you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation, either version 3 of the License, or
00009  * any later version.
00010  *
00011  * rob08 is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with rob08.  If not, see <http://www.gnu.org/licenses/>.
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 

Generated on Fri Jul 10 22:42:01 2009 for rob08 by  doxygen 1.5.4