#if !defined( __STD_SUB_VECTOR_H ) #define __STD_SUB_VECTOR_H #if( _MSC_VER >= 1000 ) #pragma once #endif #include #include "vtkSubArray.h" #include "vtkStdVector.h" #include "Macros.h" #define VECTORTYPE float // handling of standard three element vectors forming part of VECTORTYPE arrays //! Class vtkStdSubVector class vtkStdSubVector : public vtkSubArray { //***** c o n s t r u c t o r public: //! Constructor /*! Constructor enforcing the specification of an array part of which is the three element vector */ vtkStdSubVector() { } vtkStdSubVector( vtkBESSArray& a, const UINT uFirstElement ) { Define( a,uFirstElement ); } vtkStdSubVector( VECTORTYPE* pf ) { assert( pf != NULL ); Clear(); m_pData = pf; m_uSize = 3; } //! fake copy constructor vtkStdSubVector( const vtkStdSubVector& ) { assert( false ); } //***** p u b l i c m e t h o d s //! Assignment of another standar vector pointer void Copy( const vtkStdSubVector& svp ) { assert( m_uSize == 3 ); m_pData[0] = svp.m_pData[0]; m_pData[1] = svp.m_pData[1]; m_pData[2] = svp.m_pData[2]; } //! Redefine the virtual array as a range of elements of another array void Define( vtkBESSArray& a, const UINT uFirstElement ) { vtkSubArray::Define( a,uFirstElement,3 ); } //! Assignment of other vectors vtkStdSubVector& operator=( const vtkStdSubVector& ssv ) { assert( m_uSize == 3 && ssv.Size() == 3 ); m_pData[0] = ssv[0]; m_pData[1] = ssv[1]; m_pData[2] = ssv[2]; return *this; } //! Assignment of other vectors vtkStdSubVector& operator=( const vtkStdVector& sv ) { assert( m_uSize == 3 ); m_pData[0] = (VECTORTYPE)sv[0]; m_pData[1] = (VECTORTYPE)sv[1]; m_pData[2] = (VECTORTYPE)sv[2]; return *this; } //! Multiplication with scalar vtkStdVector operator*( const double d ) const { assert( m_uSize == 3 ); return vtkStdVector( d * m_pData[0],d * m_pData[1],d * m_pData[2] ); } void operator*=( const double& d ) { assert( m_uSize == 3 ); m_pData[0] = (VECTORTYPE)( m_pData[0] * d ); m_pData[1] = (VECTORTYPE)( m_pData[1] * d ); m_pData[2] = (VECTORTYPE)( m_pData[2] * d ); } //! Addition and subtraction of other vectors vtkStdSubVector& operator+=( const vtkStdVector& sv ) { assert( m_uSize == 3 ); m_pData[0] = (VECTORTYPE)( m_pData[0] + sv[0] ); m_pData[1] = (VECTORTYPE)( m_pData[1] + sv[1] ); m_pData[2] = (VECTORTYPE)( m_pData[2] + sv[2] ); return *this; } //! Addition and subtraction of other vectors vtkStdVector operator+( const vtkStdSubVector& ssv ) const { assert( m_uSize == 3 ); return vtkStdVector( (double)m_pData[0] + ssv[0], (double)m_pData[1] + ssv[1], (double)m_pData[2] + ssv[2] ); } //! Addition and subtraction of other vectors vtkStdVector operator+( const vtkStdVector& sv ) const { assert( m_uSize == 3 ); return vtkStdVector( (double)m_pData[0] + sv[0], (double)m_pData[1] + sv[1], (double)m_pData[2] + sv[2] ); } //! Addition and subtraction of other vectors vtkStdSubVector& operator-=( const vtkStdVector& sv ) { assert( m_uSize == 3 ); m_pData[0] = (VECTORTYPE)( m_pData[0] - sv[0] ); m_pData[1] = (VECTORTYPE)( m_pData[1] - sv[1] ); m_pData[2] = (VECTORTYPE)( m_pData[2] - sv[2] ); return *this; } //! Addition and subtraction of other vectors vtkStdVector operator-( const vtkStdSubVector& ssv ) const { assert( m_uSize == 3 ); return vtkStdVector( (double)m_pData[0] - ssv[0], (double)m_pData[1] - ssv[1], (double)m_pData[2] - ssv[2] ); } //! Addition and subtraction of other vectors vtkStdVector operator-( const vtkStdVector& sv ) const { assert( m_uSize == 3 ); return vtkStdVector( (double)m_pData[0] - sv[0], (double)m_pData[1] - sv[1], (double)m_pData[2] - sv[2] ); } //! Obtain the vector's square norm const double SquareNorm() const { assert( m_uSize == 3 ); return sqrt( (double)m_pData[0] * m_pData[0] + (double)m_pData[1] * m_pData[1] + (double)m_pData[2] * m_pData[2] ); } }; #endif