Newer
Older
/***************************************************************************
-------------------
begin : Feb 10, 2014
copyright : (C) 2014 by Tomas Oberhuber
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
template< int Size, typename Real = double >
class StaticVector : public Containers::StaticArray< Size, Real >
{
public:
typedef Real RealType;
enum { size = Size };
//! This sets all vector components to v
//! Copy constructor
StaticVector( const StaticVector< Size, Real >& v );
static String getType();
//! Adding operator
StaticVector& operator += ( const StaticVector& v );
//! Subtracting operator
StaticVector& operator -= ( const StaticVector& v );
//! Multiplication with number
StaticVector operator + ( const StaticVector& u ) const;
StaticVector operator - ( const StaticVector& u ) const;
//! Multiplication with number
StaticVector operator * ( const Real& c ) const;
//! Scalar product
Real operator * ( const StaticVector& u ) const;
bool operator < ( const StaticVector& v ) const;
bool operator <= ( const StaticVector& v ) const;
bool operator > ( const StaticVector& v ) const;
bool operator >= ( const StaticVector& v ) const;
template< typename OtherReal >
__cuda_callable__
operator StaticVector< Size, OtherReal >() const;
};
template< typename Real >
class StaticVector< 1, Real > : public Containers::StaticArray< 1, Real >
{
public:
typedef Real RealType;
enum { size = 1 };
//! This sets all vector components to v
//! Copy constructor
StaticVector( const StaticVector< 1, Real >& v );
static String getType();
StaticVector& operator += ( const StaticVector& v );
StaticVector& operator -= ( const StaticVector& v );
//! Multiplication with number
StaticVector operator + ( const StaticVector& u ) const;
StaticVector operator - ( const StaticVector& u ) const;
//! Multiplication with number
StaticVector operator * ( const Real& c ) const;
//! Scalar product
Real operator * ( const StaticVector& u ) const;
bool operator < ( const StaticVector& v ) const;
bool operator <= ( const StaticVector& v ) const;
bool operator > ( const StaticVector& v ) const;
bool operator >= ( const StaticVector& v ) const;
template< typename OtherReal >
__cuda_callable__
operator StaticVector< 1, OtherReal >() const;
};
template< typename Real >
class StaticVector< 2, Real > : public Containers::StaticArray< 2, Real >
{
public:
typedef Real RealType;
enum { size = 2 };
//! This sets all vector components to v
StaticVector( const Real& v1, const Real& v2 );
//! Copy constructor
StaticVector( const StaticVector< 2, Real >& v );
static String getType();
//! Adding operator
StaticVector& operator += ( const StaticVector& v );
//! Subtracting operator
StaticVector& operator -= ( const StaticVector& v );
//! Multiplication with number
//! Adding operator
StaticVector operator + ( const StaticVector& u ) const;
//! Subtracting operator
StaticVector operator - ( const StaticVector& u ) const;
//! Multiplication with number
StaticVector operator * ( const Real& c ) const;
//! Scalar product
Real operator * ( const StaticVector& u ) const;
bool operator < ( const StaticVector& v ) const;
bool operator <= ( const StaticVector& v ) const;
bool operator > ( const StaticVector& v ) const;
bool operator >= ( const StaticVector& v ) const;
template< typename OtherReal >
__cuda_callable__
operator StaticVector< 2, OtherReal >() const;
};
template< typename Real >
class StaticVector< 3, Real > : public Containers::StaticArray< 3, Real >
{
public:
typedef Real RealType;
enum { size = 3 };
//! This sets all vector components to v
StaticVector( const Real& v1, const Real& v2, const Real& v3 );
//! Copy constructor
StaticVector( const StaticVector< 3, Real >& v );
static String getType();
StaticVector& operator += ( const StaticVector& v );
StaticVector& operator -= ( const StaticVector& v );
//! Multiplication with number
StaticVector operator + ( const StaticVector& u ) const;
StaticVector operator - ( const StaticVector& u ) const;
//! Multiplication with number
StaticVector operator * ( const Real& c ) const;
//! Scalar product
Real operator * ( const StaticVector& u ) const;
bool operator < ( const StaticVector& v ) const;
bool operator <= ( const StaticVector& v ) const;
bool operator > ( const StaticVector& v ) const;
bool operator >= ( const StaticVector& v ) const;
template< typename OtherReal >
__cuda_callable__
operator StaticVector< 3, OtherReal >() const;
};
template< int Size, typename Real >
StaticVector< Size, Real > operator * ( const Real& c, const StaticVector< Size, Real >& u );
StaticVector< Size, Real > abs( const StaticVector< Size, Real >& u ) { return u.abs(); };
#include <TNL/Containers/StaticVector_impl.h>
#include <TNL/Containers/StaticVector1D_impl.h>
#include <TNL/Containers/StaticVector2D_impl.h>
#include <TNL/Containers/StaticVector3D_impl.h>
// TODO: move to some other source file
template< typename Real >
StaticVector< 3, Real > VectorProduct( const StaticVector< 3, Real >& u,
const StaticVector< 3, Real >& v )
p[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
p[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
p[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
return p;
};
template< typename Real >
Real tnlScalarProduct( const StaticVector< 2, Real >& u,
const StaticVector< 2, Real >& v )
{
return u[ 0 ] * v[ 0 ] + u[ 1 ] * v[ 1 ];
};
template< typename Real >
Real tnlScalarProduct( const StaticVector< 3, Real >& u,
const StaticVector< 3, Real >& v )
{
return u[ 0 ] * v[ 0 ] + u[ 1 ] * v[ 1 ] + u[ 2 ] * v[ 2 ];
};
template< typename Real >
Real tnlTriangleArea( const StaticVector< 2, Real >& a,
const StaticVector< 2, Real >& b,
const StaticVector< 2, Real >& c )
u1. x() = b. x() - a. x();
u1. y() = b. y() - a. y();
u1. z() = 0.0;
u2. x() = c. x() - a. x();
u2. y() = c. y() - a. y();
u2. z() = 0;
const StaticVector< 3, Real > v = VectorProduct( u1, u2 );
return 0.5 * ::sqrt( tnlScalarProduct( v, v ) );
template< typename Real >
Real tnlTriangleArea( const StaticVector< 3, Real >& a,
const StaticVector< 3, Real >& b,
const StaticVector< 3, Real >& c )
u1. x() = b. x() - a. x();
u1. y() = b. y() - a. y();
u1. z() = 0.0;
u2. x() = c. x() - a. x();
u2. y() = c. y() - a. y();
u2. z() = 0;
const StaticVector< 3, Real > v = VectorProduct( u1, u2 );
return 0.5 * ::sqrt( tnlScalarProduct( v, v ) );