text: // Magic Software, Inc.
  // http://www.magic-software.com
  // http://www.wild-magic.com
  // Copyright (c) 2004.  All Rights Reserved
  //
  // The Wild Magic Library (WML) source code is supplied under the terms of
  // the license agreement http://www.wild-magic.com/License/WildMagic.pdf and
  // may not be copied or disclosed except in accordance with the terms of that
  // agreement.
  
  //----------------------------------------------------------------------------
  template <int ISIZE>
  RVector2<ISIZE>::RVector2 ()
  {
      // the vector is uninitialized
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  RVector2<ISIZE>::RVector2 (const RVector2& rkV)
  {
      memcpy(m_akTuple,rkV.m_akTuple,2*sizeof(TRational<ISIZE>));
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  RVector2<ISIZE>::RVector2 (const TRational<ISIZE>& rkX,
      const TRational<ISIZE>& rkY)
  {
      m_akTuple[0] = rkX;
      m_akTuple[1] = rkY;
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  RVector2<ISIZE>& RVector2<ISIZE>::operator= (const RVector2& rkV)
  {
      memcpy(m_akTuple,rkV.m_akTuple,2*sizeof(TRational<ISIZE>));
      return *this;
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  TRational<ISIZE> RVector2<ISIZE>::X () const
  {
      return m_akTuple[0];
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  TRational<ISIZE>& RVector2<ISIZE>::X ()
  {
      return m_akTuple[0];
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  TRational<ISIZE> RVector2<ISIZE>::Y () const
  {
      return m_akTuple[1];
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  TRational<ISIZE>& RVector2<ISIZE>::Y ()
  {
      return m_akTuple[1];
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  RVector2<ISIZE> RVector2<ISIZE>::Perp () const
  {
      return RVector2(m_akTuple[1],-m_akTuple[0]);
  }
  //----------------------------------------------------------------------------
  template <int ISIZE>
  TRational<ISIZE> RVector2<ISIZE>::Kross (const RVector2& rkV) const
  {
      return m_akTuple[0]*rkV.m_akTuple[1] - m_akTuple[1]*rkV.m_akTuple[0];
  }
  //----------------------------------------------------------------------------
  