00001 /* **-*-c++-*-************************************************************** 00002 Copyright (C)2003 David Jung <opensim@pobox.com> 00003 00004 This program/file is free software; you can redistribute it and/or modify 00005 it under the terms of the GNU General Public License as published by 00006 the Free Software Foundation; either version 2 of the License, or 00007 (at your option) any later version. 00008 00009 This program is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 GNU General Public License for more details. (http://www.gnu.org) 00013 00014 You should have received a copy of the GNU General Public License 00015 along with this program; if not, write to the Free Software 00016 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 00018 $Id: PositionableOrientable 1031 2004-02-11 20:46:36Z jungd $ 00019 $Revision: 1.2 $ 00020 $Date: 2004-02-11 15:46:36 -0500 (Wed, 11 Feb 2004) $ 00021 $Author: jungd $ 00022 00023 ****************************************************************************/ 00024 00025 #ifndef _PHYSICS_POSITIONABLEORIENTABLE_ 00026 #define _PHYSICS_POSITIONABLEORIENTABLE_ 00027 00028 #include <physics/physics> 00029 00030 #include <physics/Positionable> 00031 #include <physics/Orientable> 00032 00033 #include <base/Transform> 00034 00035 00036 00037 namespace physics { 00038 00039 /// interface for things that can be positioned and oriented in 3D space 00040 class PositionableOrientable : public Positionable, public Orientable 00041 { 00042 public: 00043 PositionableOrientable() {} 00044 PositionableOrientable(const PositionableOrientable& po) { setConfiguration(po.getConfiguration()); } 00045 00046 virtual PositionableOrientable& operator=(const PositionableOrientable& po) { setConfiguration(po.getConfiguration()); return *this; } 00047 00048 virtual void setPositionOrientation(const Point3& pos, const Orient& orient) 00049 { 00050 setConfiguration( base::Transform(pos, orient) ); 00051 } 00052 00053 virtual void setConfiguration(const base::Transform& configuration) 00054 { 00055 setPosition( configuration.getTranslation() ); 00056 setOrientation( configuration.getRotation() ); 00057 } 00058 00059 00060 virtual base::Transform getConfiguration() const 00061 { 00062 return base::Transform( getPosition(), getOrientation() ); 00063 } 00064 00065 00066 // convenience methods for 2D manipulations 00067 00068 /// set the 2D (x,y,theta) position (theta is rot. angle about Z-axis) 00069 virtual void setPosition2D(const base::Point2& p, Real theta); 00070 00071 /// get the 2D (x,y) position 00072 virtual base::Point2 getPosition2D() const 00073 { 00074 Point3 pos( getPosition() ); 00075 return Point2(pos.x, pos.y); 00076 } 00077 00078 /// get the 2D angle theta (rot. angle about Z-axis) 00079 Real getOrientation2D() const; 00080 00081 }; 00082 00083 00084 } // physics 00085 00086 #endif