vector.h

来自「2009 ROBOCUP 仿真2DSERVER 源码」· C头文件 代码 · 共 365 行

H
365
字号
// -*-c++-*-/***************************************************************************                          vector.h  -  Geometry classes                             -------------------    begin                : 31-DEC-2001    copyright            : (C) 2001 by The RoboCup Soccer Server                           Maintainance Group.    email                : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU LGPL as published by the Free Software  * *   Foundation; either version 2 of the License, or (at your option) any  * *   later version.                                                        * *                                                                         * ***************************************************************************/#ifndef VECTOR_H#define VECTOR_H#include "utility.h"#include <iostream>#include <algorithm>namespace rcss {namespace geom {class Vector2D {public:    typedef double              value;    typedef value&              reference;    typedef const value&        const_reference;    typedef value*              pointer;    typedef const value*        const_pointer;    typedef value*              iterator;    typedef const value*        const_iterator;    typedef std::size_t         size_type;    enum index {        X,        Y,        DIM    };protected:    value M_data[ DIM ];public:    explicit    Vector2D ( const_reference a,               const_reference b )      {          M_data[ X ] = a;          M_data[ Y ] = b;      }    explicit    Vector2D ()      {          null();      }    explicit    Vector2D ( const value vec[ DIM ] )      {          for ( size_type i = X; i < DIM; ++i )          {              M_data[ i ] = vec [ i ];          }      }    void null()      {          for ( size_type i = X; i < DIM; ++i )          {              M_data[ i ] = 0.0;          }      }    iterator begin()      {          return M_data;      }    const_iterator begin() const      {          return M_data;      }    iterator end()      {          return M_data + DIM;      }    const_iterator end() const      {          return M_data + DIM;      }    reference operator[]( const index & i )      {          return M_data[ i ];      }    const_reference operator[]( const index & i ) const      {          return M_data[ i ];      }    Vector2D operator+() const      {          return *this;      }    Vector2D operator-() const      {          Vector2D rval ( *this );          for ( size_type i = X; i < DIM; ++i )          {              rval.M_data[ i ] = -M_data[ i ];          }          return rval;      }    Vector2D & operator+=( const Vector2D & vec )      {          for ( size_type i = X; i < DIM; ++i )          {              M_data[ i ] += vec.M_data[ i ];          }          return *this;      }    Vector2D & operator-=( const Vector2D & vec )      {          return *this += -vec;      }    Vector2D & operator*=( const_reference scaler )      {          for ( size_type i = X; i < DIM; ++i )          {              M_data[ i ] *= scaler;          }          return *this;      }    Vector2D & operator/=( const_reference scaler )      {          for ( size_type i = X; i < DIM; ++i )          {              M_data[ i ] /= scaler;          }          return *this;      }    value getMag() const      {          value sum = 0.0;          for ( size_type i = X; i < DIM; ++i )          {              sum += pow ( M_data[ i ], 2 );          }          return sqrt ( sum );      }    void setMag( const_reference mag );    value getHead() const      {          return std::atan2( M_data[ Y ], M_data[ X ] );      }    void setHead( const_reference head );    Vector2D getNorm() const;    reference getX()      {          return M_data[ X ];      }    const_reference getX() const      {          return M_data[ X ];      }    reference getY()      {          return M_data[ Y ];      }    const_reference getY() const      {          return M_data[ Y ];      }    Vector2D & rotate( const_reference ang )      {          setHead( getHead () + ang );          return *this;      }}; // end class Vector2D}}inlinebooloperator==( const rcss::geom::Vector2D & a,            const rcss::geom::Vector2D & b ){    return std::equal( a.begin(), a.end(), b.begin() );}inlinebooloperator!=( const rcss::geom::Vector2D & a,            const rcss::geom::Vector2D & b ){    return ! ( a == b );}inlinestd::ostream &operator<<( std::ostream & o,            const rcss::geom::Vector2D & data ){    return o << "rcss::geom::Vector2D( "             << data.getX () << ", "             << data.getY () << " )";}inlinercss::geom::Vector2Doperator+( const rcss::geom::Vector2D & lhs,           const rcss::geom::Vector2D & rhs ){    return rcss::geom::Vector2D( lhs ) += rhs;}inlinercss::geom::Vector2Doperator-( const rcss::geom::Vector2D & lhs,           const rcss::geom::Vector2D & rhs ){    return rcss::geom::Vector2D( lhs ) -= rhs;}inlinercss::geom::Vector2Doperator*( const rcss::geom::Vector2D & vec,           rcss::geom::Vector2D::const_reference scaler ){    return rcss::geom::Vector2D( vec ) *= scaler;}inlinercss::geom::Vector2Doperator*( rcss::geom::Vector2D::const_reference scaler,           const rcss::geom::Vector2D & vec ){    return vec * scaler;}inlinercss::geom::Vector2Doperator/( const rcss::geom::Vector2D & vec,           rcss::geom::Vector2D::const_reference scaler ){    return rcss::geom::Vector2D( vec ) /= scaler;}namespace rcss {namespace geom {inlinevoidVector2D::setMag( const_reference mag ){    *this = getNorm() * mag;}inlinevoidVector2D::setHead( const_reference head ){    *this = Vector2D( std::cos( head ), std::sin( head ) ) * getMag();}inlineVector2DVector2D::getNorm() const{    return *this / getMag();}inlineVector2D::valuedot( const Vector2D & vec1,     const Vector2D & vec2 ){    return vec1.getX () * vec2.getX ()        + vec1.getY () * vec2.getY ();}inlineVector2D::valueabsAngle( const Vector2D & a,          const Vector2D & b ){    return std::acos( dot( a.getNorm(), b.getNorm() ) );}inlineVector2D::valueangle( const Vector2D & a,       const Vector2D & b ){    return normalize_angle( b.getHead() - a.getHead() );}inlineVector2DunitVector2D( Vector2D::const_reference head ){    Vector2D tmp;    tmp.getX() = std::cos( head );    tmp.getY() = std::sin( head );    return tmp;}inlineVector2DpolarVector2D( Vector2D::const_reference mag,               Vector2D::const_reference head ){    Vector2D tmp = unitVector2D( head );    tmp.setMag( mag );    return tmp;}inlineVector2D::valuedist( const Vector2D & a,      const Vector2D & b ){    return ( a - b ).getMag();}} // end namespace geom} // end namespace rcs#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?