Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

Objects.C

Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2000,2001, Jelle Kok, University of Amsterdam
00003 All rights reserved.
00004 
00005 Redistribution and use in source and binary forms, with or without 
00006 modification, are permitted provided that the following conditions are met:
00007 
00008 1. Redistributions of source code must retain the above copyright notice, this 
00009 list of conditions and the following disclaimer. 
00010 
00011 2. Redistributions in binary form must reproduce the above copyright notice, 
00012 this list of conditions and the following disclaimer in the documentation 
00013 and/or other materials provided with the distribution. 
00014 
00015 3. Neither the name of the University of Amsterdam nor the names of its 
00016 contributors may be used to endorse or promote products derived from this 
00017 software without specific prior written permission. 
00018 
00019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
00020 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00021 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
00022 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 
00023 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
00024 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
00025 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
00026 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
00027 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
00028 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00029 */
00041 #include"Objects.h"
00042 
00043 #include<stdlib.h>       // needed for free
00044 #include<iostream.h>     // needed for cout
00045 #ifdef Solaris
00046   #include <strings.h>   // needed for strdup
00047 #else
00048   #include <string.h>    // needed for strdup
00049 #endif
00050 
00051 /******************************************************************************/
00052 /********************** CLASS OBJECT ******************************************/
00053 /******************************************************************************/
00054 
00057 Object::Object( )
00058 {
00059   objectType                   = OBJECT_ILLEGAL;
00060 }
00061 
00065 AngDeg Object::getRelativeAngle( )
00066 {
00067   return VecPosition::normalizeAngle(posRelative.getDirection());
00068 }
00069 
00073 double Object::getRelativeDistance( )
00074 {
00075   return posRelative.getMagnitude();
00076 }
00077 
00083 double Object::getConfidence( Time time )
00084 {
00085   if( timeLastSeen.getTime() == -1 )
00086     return 0.0;
00087 
00088   return max( 0.0, 1.0-(double)(time.getTimeDifference(timeLastSeen))/100.0);
00089 }
00090 
00094 bool Object::setType( ObjectT o )
00095 {
00096   objectType = o;
00097   return true;
00098 }
00099 
00102 ObjectT  Object::getType() const
00103 {
00104   return objectType;
00105 }
00106 
00114 bool Object::setRelativePosition( double dDist, AngDeg ang, Time time )
00115 {
00116   posRelative.setVecPosition( dDist, ang, POLAR );
00117   setTimeRelativePosition( time );
00118   return true;
00119 }
00120 
00126 bool Object::setRelativePosition( VecPosition v, Time time )
00127 {
00128   posRelative = v;
00129   setTimeRelativePosition( time );
00130   return true;
00131 }
00132 
00138 VecPosition Object::getRelativePosition() const
00139 {
00140   return posRelative;
00141 }
00142 
00146 bool Object::setTimeRelativePosition( Time time )
00147 {
00148   timeRelativePosition = time;
00149   return true;
00150 }
00151 
00155 Time Object::getTimeRelativePosition() const
00156 {
00157   return timeRelativePosition;
00158 }
00159 
00165 bool Object::setGlobalPosition( VecPosition p, Time time )
00166 {
00167   posGlobal = p;
00168   setTimeGlobalPosition( time );
00169   return true;
00170 }
00171 
00177 VecPosition Object::getGlobalPosition() const
00178 {
00179   return posGlobal;
00180 }
00181 
00185 bool Object::setTimeGlobalPosition( Time time )
00186 {
00187   timeGlobalPosition = time;
00188   return true;
00189 }
00190 
00194 Time Object::getTimeGlobalPosition() const
00195 {
00196   return timeGlobalPosition;
00197 }
00198 
00206 bool Object::setGlobalPositionLastSee( VecPosition p, Time time )
00207 {
00208   posGlobalLastSee = p;
00209   setTimeGlobalPosDerivedFromSee( time );
00210   return true;
00211 }
00212 
00217 VecPosition Object::getGlobalPositionLastSee() const
00218 {
00219   return posGlobalLastSee;
00220 }
00221 
00226 bool Object::setTimeGlobalPosDerivedFromSee( Time time )
00227 {
00228   timeGlobalPosDerivedFromSee = time;
00229   return true;
00230 }
00231 
00235 Time Object::getTimeGlobalPosDerivedFromSee() const
00236 {
00237   return timeGlobalPosDerivedFromSee;
00238 }
00239 
00244 bool Object::setTimeLastSeen( Time time)
00245 {
00246   timeLastSeen = time;
00247   return true;
00248 }
00249 
00253 Time Object::getTimeLastSeen() const
00254 {
00255   return timeLastSeen;
00256 }
00257 
00258 
00259 /******************************************************************************/
00260 /********************** CLASS FIXEDOBJECT ************************************/
00261 /******************************************************************************/
00262 
00266 void FixedObject::show( ostream & os )
00267 {
00268   char buf[MAX_TEAM_NAME_LENGTH];
00269 
00270   // DEFAULT_TEAM_NAME is used since it is not a player, so name does not matter
00271   SoccerTypes::getObjectStr( buf, objectType, DEFAULT_TEAM_NAME );
00272   os <<  buf
00273      << " rel("  << posRelative << " r:" << posRelative.getMagnitude()
00274      << " phi:"  << posRelative.getDirection()
00275      << " t:"    << timeRelativePosition << ")"
00276      << " seen:" << timeLastSeen << endl;
00277 }
00278 
00287 VecPosition FixedObject::getGlobalPosition( SideT s, double dGoalWidth )const
00288 {
00289   return SoccerTypes::getGlobalPositionFlag( getType(), s, dGoalWidth );
00290 }
00291 
00298 AngDeg FixedObject::getGlobalAngle( SideT s )
00299 {
00300   return SoccerTypes::getGlobalAngleLine( getType(), s );
00301 }
00302 
00303 /******************************************************************************/
00304 /********************** CLASS DYNAMICOBJECT ***********************************/
00305 /******************************************************************************/
00306 
00309 DynamicObject::DynamicObject( ):Object( )
00310 {
00311   dRelativeDistanceChange   = UnknownDoubleValue;
00312   dRelativeAngleChange      = UnknownDoubleValue;
00313 }
00314 
00320 bool DynamicObject::setGlobalVelocity( VecPosition v, Time time)
00321 {
00322   if( v.getMagnitude() < EPSILON )
00323     vecGlobalVelocity.setVecPosition( 0.0, 0.0 );
00324   else
00325      vecGlobalVelocity = v;
00326   setTimeGlobalVelocity( time );
00327   return true;
00328 }
00329 
00333 VecPosition DynamicObject::getGlobalVelocity( ) const
00334 {
00335   return vecGlobalVelocity;
00336 }
00337 
00341 double DynamicObject::getSpeed( ) const
00342 {
00343   return vecGlobalVelocity.getMagnitude();
00344 }
00345 
00350 bool DynamicObject::setTimeGlobalVelocity( Time time )
00351 {
00352   timeGlobalVelocity = time;
00353   return true;
00354 }
00355 
00359 Time DynamicObject::getTimeGlobalVelocity() const
00360 {
00361   return timeGlobalVelocity;
00362 }
00363 
00369 bool DynamicObject::setRelativeDistanceChange( double d, Time time )
00370 {
00371   dRelativeDistanceChange = d;
00372   setTimeChangeInformation( time );
00373   return true;
00374 }
00375 
00382 double DynamicObject::getRelativeDistanceChange() const
00383 {
00384   return dRelativeDistanceChange;
00385 }
00386 
00392 bool DynamicObject::setRelativeAngleChange( double d, Time time )
00393 {
00394   dRelativeAngleChange = d;
00395   setTimeChangeInformation( time );
00396   return true;
00397 }
00398 
00403 double DynamicObject::getRelativeAngleChange() const
00404 {
00405   return dRelativeAngleChange;
00406 }
00407 
00411 bool DynamicObject::setTimeChangeInformation( Time time )
00412 {
00413   timeChangeInformation = time ;
00414   return true;
00415 }
00416 
00420 Time DynamicObject::getTimeChangeInformation()  const
00421 {
00422   return timeChangeInformation;
00423 }
00424 
00425 
00426 /******************************************************************************/
00427 /********************** CLASS PLAYEROBJECT ************************************/
00428 /******************************************************************************/
00429 
00432 PlayerObject::PlayerObject( ):DynamicObject( )
00433 {
00434   angGlobalBodyAngle   = UnknownAngleValue;
00435   angGlobalNeckAngle   = UnknownAngleValue;
00436   isKnownPlayer        = false;
00437   isGoalie             = false;
00438 
00439   angRelativeBodyAngle = UnknownAngleValue;
00440   angRelativeNeckAngle = UnknownAngleValue;
00441 }
00442 
00448 bool PlayerObject::setRelativeBodyAngle( AngDeg ang, Time time )
00449 {
00450   angRelativeBodyAngle = ang;
00451   setTimeRelativeAngles( time );
00452   return true;
00453 }
00454 
00458 AngDeg PlayerObject::getRelativeBodyAngle( )  const
00459 {
00460   return angRelativeBodyAngle;
00461 }
00462 
00468 bool PlayerObject::setGlobalBodyAngle( AngDeg ang, Time time)
00469 {
00470   angGlobalBodyAngle = ang;
00471   setTimeGlobalAngles( time );
00472   return true;
00473 }
00474 
00478 AngDeg PlayerObject::getGlobalBodyAngle( )  const
00479 {
00480   return angGlobalBodyAngle;
00481 }
00482 
00488 bool PlayerObject::setRelativeNeckAngle( AngDeg ang, Time time )
00489 {
00490   angRelativeNeckAngle = ang;
00491   setTimeRelativeAngles( time );
00492   return true;
00493 }
00494 
00498 AngDeg PlayerObject::getRelativeNeckAngle( )  const
00499 {
00500   return angRelativeNeckAngle;
00501 }
00502 
00508 bool PlayerObject::setGlobalNeckAngle( AngDeg ang, Time time )
00509 {
00510   angGlobalNeckAngle = ang;
00511   setTimeGlobalAngles( time );
00512   return true;
00513 }
00514 
00518 AngDeg PlayerObject::getGlobalNeckAngle( )  const
00519 {
00520   return angGlobalNeckAngle;
00521 }
00522 
00526 bool PlayerObject::setTimeRelativeAngles( Time time )
00527 {
00528   timeRelativeAngles = time;
00529   return true;
00530 }
00531 
00535 Time PlayerObject::getTimeRelativeAngles( ) const
00536 {
00537   return timeRelativeAngles ;
00538 }
00539 
00543 bool PlayerObject::setTimeGlobalAngles( Time time )
00544 {
00545   timeGlobalAngles = time;
00546   return true;
00547 }
00548 
00552 Time PlayerObject::getTimeGlobalAngles( ) const
00553 {
00554   return timeGlobalAngles ;
00555 }
00556 
00563 bool PlayerObject::setIsKnownPlayer( bool b )
00564 {
00565   isKnownPlayer = b;
00566   return true;
00567 }
00568 
00574 bool PlayerObject::getIsKnownPlayer() const
00575 {
00576   return isKnownPlayer;
00577 }
00578 
00582 bool PlayerObject::setIsGoalie( bool b )
00583 {
00584   isGoalie = b;
00585   return true;
00586 }
00587 
00590 bool PlayerObject::getIsGoalie() const
00591 {
00592   return isGoalie;
00593 }
00594 
00595 
00599 void PlayerObject::show( ostream & os )
00600 {
00601   show( DEFAULT_TEAM_NAME, os );
00602 }
00603 
00608 void PlayerObject::show( const char* strTeamName , ostream & os )
00609 {
00610   char buf[MAX_TEAM_NAME_LENGTH];
00611   SoccerTypes::getObjectStr( buf, objectType, strTeamName );
00612   os << buf << "(rel("                << posRelative
00613             << ", "                   << timeRelativePosition
00614             << ") (global("           << posGlobal
00615             << ", "                   << timeGlobalPosition
00616             << ")(vel("               << vecGlobalVelocity
00617             << ", "                   << timeGlobalVelocity
00618             << "(ang(b:"              << getGlobalBodyAngle()
00619             << ", n:"                 << angGlobalNeckAngle
00620             << ", "                   << timeGlobalAngles
00621             << ")(lastseen:"          << timeLastSeen
00622             << ", globalposderived: " <<  timeGlobalPosDerivedFromSee << endl;
00623 }
00624 
00625 /******************************************************************************/
00626 /********************** CLASS BALLOBJECT **************************************/
00627 /******************************************************************************/
00628 
00631 BallObject::BallObject():DynamicObject()
00632 {
00633 
00634 }
00635 
00638 void BallObject::show( ostream& os)
00639 {
00640   char buf[MAX_TEAM_NAME_LENGTH];
00641   SoccerTypes::getObjectStr( buf, objectType, DEFAULT_TEAM_NAME );
00642   os <<  buf
00643        << " rel("               << posRelative
00644        << ",r: "                << posRelative.getMagnitude()
00645        << ", phi: "             << posRelative.getDirection()
00646        << ", "                  << timeRelativePosition
00647        << ") global("           << posGlobal
00648        << ", "                  << timeGlobalPosition
00649        << "), vel("             << vecGlobalVelocity
00650        << ", "                  << timeGlobalVelocity
00651        << "), changes("         << dRelativeDistanceChange
00652        << ", "                  << dRelativeAngleChange
00653        << ") last seen:"        << timeLastSeen
00654        << " globalposderived: " << timeGlobalPosDerivedFromSee << endl;
00655 }
00656 
00657 /******************************************************************************/
00658 /********************** CLASS AGENTOBJECT *************************************/
00659 /******************************************************************************/
00660 
00665 AgentObject::AgentObject( double dStaminaMax ):PlayerObject( )
00666 {
00667   viewAngle              = VA_ILLEGAL;
00668   viewQuality            = VQ_ILLEGAL;
00669 
00670   stamina.setStamina ( dStaminaMax );
00671   stamina.setEffort  ( 1.0 );
00672   stamina.setRecovery( 1.0 );
00673   velSpeedRelToNeck.setVecPosition( 0.0, 0.0 );
00674 
00675   angGlobalNeckAngle   = UnknownAngleValue;
00676   angBodyAngleRelToNeck  = UnknownAngleValue;
00677 }
00678 
00682 void AgentObject::show( ostream& os )
00683 {
00684   show( DEFAULT_TEAM_NAME, os );
00685 }
00686 
00691 void AgentObject::show( const char * strTeamName, ostream & os )
00692 {
00693   char buf[MAX_TEAM_NAME_LENGTH];
00694   SoccerTypes::getObjectStr( buf, objectType, strTeamName );
00695   os   <<  buf
00696        << " (global("    << posGlobal
00697        << ", "           << timeGlobalPosition
00698        << ") (vel("      << vecGlobalVelocity
00699        << ", "           << timeGlobalVelocity
00700        << ") (angles(n:" << angGlobalNeckAngle
00701        << ", b:"         << angBodyAngleRelToNeck << ") ";
00702   stamina.show( os );
00703 }
00704 
00708 ViewAngleT AgentObject::getViewAngle() const
00709 {
00710   return viewAngle;
00711 }
00712 
00718 VecPosition AgentObject::getPositionDifference() const
00719 {
00720   return posPositionDifference;
00721 }
00722 
00728 bool  AgentObject::setPositionDifference( VecPosition p )
00729 {
00730   posPositionDifference = p;
00731   return true;
00732 }
00733 
00737 bool AgentObject::setViewAngle( ViewAngleT v )
00738 {
00739   viewAngle = v;
00740   return true;
00741 }
00742 
00746 ViewQualityT AgentObject::getViewQuality() const
00747 {
00748   return viewQuality;
00749 }
00750 
00754 bool AgentObject::setViewQuality( ViewQualityT v )
00755 {
00756   viewQuality = v;
00757   return true;
00758 }
00759 
00762 Stamina AgentObject::getStamina( ) const
00763 {
00764   return stamina;
00765 }
00766 
00770 bool AgentObject::setStamina( Stamina sta )
00771 {
00772   stamina = sta;
00773   return true ;
00774 }
00775 
00780 VecPosition AgentObject::getSpeedRelToNeck( ) const
00781 {
00782   return velSpeedRelToNeck;
00783 }
00784 
00789 bool AgentObject::setSpeedRelToNeck( VecPosition v )
00790 {
00791   velSpeedRelToNeck = v;
00792   return true;
00793 }
00794 
00798 bool AgentObject::setGlobalNeckAngle( AngDeg ang )
00799 {
00800   angGlobalNeckAngle = ang;
00801   angGlobalBodyAngle = VecPosition::normalizeAngle(getBodyAngleRelToNeck()+ang);
00802   return true ;
00803 }
00804 
00810 AngDeg AgentObject::getBodyAngleRelToNeck( ) const
00811 {
00812   return angBodyAngleRelToNeck;
00813 }
00814 
00818 bool AgentObject::setBodyAngleRelToNeck( AngDeg ang )
00819 {
00820   angBodyAngleRelToNeck = ang;
00821 //  angGlobalBodyAngle = VecPosition::normalizeAngle(getGlobalNeckAngle()+ang);
00822   return true;
00823 }
00824 
00825 /******************************************************************************/
00826 /********************** CLASS STAMINA *****************************************/
00827 /******************************************************************************/
00828 
00834 Stamina::Stamina( double dSta, double dEff, double dRec )
00835 {
00836   setStamina ( dSta );
00837   setEffort  ( dEff );
00838   setRecovery( dRec );
00839 }
00840 
00844 void Stamina::show( ostream & os)
00845 {
00846   os  << "(sta:"   << m_dStamina
00847       << ", eff:"  << m_dEffort
00848       << ", rec: " << m_dRecovery << ")" << endl;
00849 }
00850 
00853 double Stamina::getStamina() const
00854 {
00855   return m_dStamina;
00856 }
00857 
00862 bool Stamina::setStamina( double d )
00863 {
00864   if( d < 0.0 )
00865   {
00866     m_dStamina = 0.0;
00867     return false;
00868   }
00869   else
00870     m_dStamina = d;
00871   return true;
00872 }
00873 
00880 double Stamina::getEffort() const
00881 {
00882   return m_dEffort;
00883 }
00884 
00890 bool Stamina::setEffort( double d )
00891 {
00892   if( d < 0.0 )
00893   {
00894     m_dEffort = 0.0;
00895     return false;
00896   }
00897    else if( d > 1.0 )
00898   {
00899     m_dEffort = 1.0;
00900     return false;
00901   }
00902   else
00903     m_dEffort = d;
00904   return true;
00905 }
00906 
00913 double Stamina::getRecovery() const
00914 {
00915   return m_dRecovery;
00916 }
00917 
00923 bool Stamina::setRecovery( double d )
00924 {
00925   if( d < 0.0 )
00926   {
00927     m_dRecovery = 0.0;
00928     return false;
00929   }
00930    else if( d > 1.0 )
00931   {
00932     m_dRecovery = 1.0;
00933     return false;
00934   }
00935   else
00936     m_dRecovery = d;
00937   return true;
00938 }
00939 
00940 /******************************************************************************/
00941 /********************** TESTING PURPOSES **************************************/
00942 /******************************************************************************/
00943 
00944 /*
00945 int main( void )
00946 {
00947   PlayerObject p();
00948   BallObject b();
00949   FixedObject s();
00950 
00951   cout << p.getDeltaRelativeAngle() << endl <<
00952       b.getDeltaRelativeDistance() << endl <<
00953   p.getTimeRelativeDistance() << endl;
00954   return 0;
00955 
00956 }
00957 */

Generated on Thu Mar 7 00:37:42 2002 for UvA Trilearn 2001 by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001