Source: classlib/include/nmath.h


Annotated List
Files
Globals
Hierarchy
Index
#ifndef NMATH__
#define NMATH__

#include 
#include 
#include 
#include 

#include 

#define EPS 0.001
#define DPI ( M_PI * 2.0 )
#define EquEps( a, b, eps )	(fabs((a)-(b)) < (eps))
#define ZeroEps( a, eps )	(fabs(a) < (eps))
#define EquEPS( a, b )	(fabs((a)-(b)) < EPS)
#define ZeroEPS( a )	(fabs(a) < EPS)
#define DimMat (sizeof( double ) * 16)
#define Freccia 1.0
#define MAXNPTI 1000
#define BIG_FLOAT	10e7

// conversione da gradi a radianti
#define G2R(x)	(( ((double)(x)) * M_PI) / 180.0)
// conversione radianti in gradi
#define R2G(x)	(( ((double)(x)) * 180.0) / M_PI)

// informazioni per funzioni di elaborazione archi
struct ArcInfo
{
  float cx, cy, raggio;
  double angStart, angStop;
};

#ifdef __cplusplus

#ifndef SWAPFUN__
#define SWAPFUN__

// funzione template di swapping
template  inline void Swap( T &t1, T &t2 )
{
	T tmp;
	tmp = t1;
	t1  = t2;
	t2  = tmp;
}

// in t1 sempre il maggiore dei due
template  inline void maxSwap( T &t1, T &t2 )
{
	if( t2 > t1 ) {
		T tmp;
		tmp = t1;
		t1  = t2;
		t2  = tmp;
	}
}

// in t1 sempre il minore dei due
template  inline void minSwap( T &t1, T &t2 )
{
	if( t2 < t1 ) {
		T tmp;
		tmp = t1;
		t1  = t2;
		t2  = tmp;
	}
}

#endif // SWAPFUN__

class Linea2D;
class Linea3D;

class Matrix3
{
public:
    double m[4][4];

    Matrix3();
    Matrix3( const double ma[4][4] ) { copymatrix( ma ); }
    Matrix3( const float ma[4][4] ) { copymatrix( m, ma ); }
    Matrix3( const Matrix3 &ma ) { copymatrix( ma.m ); }
    virtual ~Matrix3() {}
    void MultMatrix( Matrix3& );
    void MultMatrix( double ma[4][4] );
    void ReadMatrix( void *m1 ) { memcpy( m1, m, DimMat ); }
    void WriteMatrix( void *m1 ) { memcpy( m, m1, DimMat ); }
    void Clear0() { memset( m, 0, DimMat ); }
    void ClearI();
    void ScalaMatrix( double x, double y, double z );
    void TraslaMatrix( double x, double y, double z );
    void RotateXMatrix( double angolo );
    void RotateYMatrix( double angolo );
    void RotateYMatrixCart( double angolo );
    void RotateZMatrix( double angolo );
    void RotateXMatrix( double s, double c );
    void RotateYMatrix( double s, double c );
    void RotateYMatrixCart( double s, double c );
    void RotateZMatrix( double s, double c );
    void MultPoint( double &x, double &y, double &z ) const;
    void MultPoint( float &x, float &y, float &z ) const;
    void MultPoint( int &x, int &y, int &z ) const;
    void MultPoint( double p[4] ) const;
    void GetIdentita( void *mi );

    void operator = ( const Matrix3& m2 ) { copymatrix( m2.m ); }
    void operator = ( const double ma[4][4] ) { copymatrix( ma ); }
    double& operator() ( int a, int b ) { return m[a][b]; }
   	int operator == ( const Matrix3& m ) const {return &m == this;}

protected:
    void copymatrix( double m1[4][4], const double m2[4][4] ) { memcpy( m1, m2, DimMat ); }
    void copymatrix( double m1[4][4], const float m2[4][4] );
    void copymatrix( const double m1[4][4] ) { memcpy( m, m1, DimMat ); }

private:
    static const double Identita[4][4];
};

class Punto2D
{
friend class Linea2D;
public:
    float x, y;

    Punto2D() { x=y=0.0f; }
    Punto2D( float xx, float yy ) { x = xx; y = yy; }
    Punto2D( const Punto2D &p ) { x = p.x; y = p.y; }
    virtual ~Punto2D() {}
    double GetDistance( const Punto2D& p ) const;
	Punto2D& AccumulaMin( const Punto2D& p );
	Punto2D& AccumulaMax( const Punto2D& p );
	Punto2D& AccumulaMin( float x, float y );
	Punto2D& AccumulaMax( float x, float y );
    void MultMatrixXY( Matrix3& m );
    void MultMatrixXZ( Matrix3& m );
    Punto2D& operator = ( const Punto2D &p ) { x=p.x; y=p.y; return *this; }
    Punto2D  operator - ( const Punto2D& p2 ) const;
    Punto2D  operator + ( const Punto2D& p2 ) const;
    Punto2D  operator * ( const double scalare ) const;
    Punto2D& operator -= ( const Punto2D& p2 );
    Punto2D& operator += ( const Punto2D& p2 );
    int operator == ( const Punto2D& p2 ) const;
    int operator != ( const Punto2D& p2 ) const;

    static void SetEpsilon( float eps );
    static void GetEpsilon( float&, float& );

private:
    static float epsilonX;
	static float epsilonY;
};


class Punto3D
{
friend class Linea3D;
public:
    float x, y, z;

    Punto3D() { x=y=z=0.0f; }
    Punto3D( float xx, float yy, float zz ) { x = xx; y = yy; z = zz; }
    Punto3D( const Punto3D &p ) { x = p.x; y = p.y; z = p.z; }
    virtual ~Punto3D() {}
    double GetDistance( const Punto3D& p ) const;
    double GetMagnitude( const Punto3D& p ) const;
	Punto3D& AccumulaMin( const Punto3D& p );
	Punto3D& AccumulaMax( const Punto3D& p );
	Punto3D& AccumulaMin( float x, float y, float z );
	Punto3D& AccumulaMax( float x, float y, float z );
    void MultMatrix( Matrix3& m );
    Punto3D& operator = ( const Punto3D &p ) { x=p.x; y=p.y; z=p.z; return *this; }
    Punto3D  operator - ( const Punto3D& p2 ) const;
    Punto3D  operator + ( const Punto3D& p2 ) const;
    Punto3D  operator * ( const double scalare ) const;
    Punto3D  operator * ( const Punto3D &p ) const;
    Punto3D& operator -= ( const Punto3D& p2 );
    Punto3D& operator += ( const Punto3D& p2 );
    int operator == ( const Punto3D& p2 ) const;
    int operator != ( const Punto3D& p2 ) const;

    static void SetEpsilon( float eps );
    static void GetEpsilon( float&, float&, float& );

private:
    static float epsilonX;
	static float epsilonY;
	static float epsilonZ;
};

class Linea2D
{
private:
    static float epsilonAng;
protected:
    Punto2D p1, p2, b1, b2;
    double coeff;
    char Tipo;

public:
    Linea2D();
    Linea2D( const Punto2D& pa, const Punto2D& pb );
    Linea2D( const Punto3D& pa, const Punto3D& pb );
    Linea2D( const Punto3D& pa, const Punto3D& pb, int );
    Linea2D( const Linea2D &l );
    virtual ~Linea2D() {}

	// informazioni sulla linea
    int InfoLinea();
    int InSide( const Punto2D& p ) const;
    int InLinea( const Linea2D &l ) const;
    int InLineaFine( Linea2D &l ) const;
    int IsPuntoRetta( const Punto2D& p ) const;
    int IsPuntoLinea( const Punto2D& p ) const;
    int GetTipo() const { return (int)Tipo; }
    double GetCoeff() const { return coeff; }
    int HalfPlane( const Punto2D &p ) const;
    int IsNull() const { return Tipo == 3; }
    double GetAngolo() const;
	// distanza
    double GetDistance( const Punto2D& p ) const;
    double GetDistance( const Linea2D& l ) const;
	// intersezione
    int IntersecaRette( const Linea2D &l, Punto2D &intr ) const;
    int IntersecaLinee( const Linea2D &l, Punto2D &intr ) const;
    int IntersecaPerpendicolare( Punto2D &p, Punto2D &intr ) const;
	// perpendicolari/parallele
    Linea2D CostruisciPerpendicolare( int ptflag ) const;
	Linea2D ParallelaPerPunto(Punto2D& pto) const;
	Linea2D PerpendicolarePerPunto(Punto2D& pto) const;
	// operatori
    Linea2D& operator = ( const Linea2D& l );
    Punto2D operator[] ( int idx ) const;
    int  operator == ( const Linea2D& l2 ) const;
    int  operator != ( const Linea2D& l2 ) const;
    Linea2D operator & ( const Linea2D& l2 ) const;
	int operator | ( const Linea2D& l2 ) const;
	int operator || ( const Linea2D& l2 ) const;
	// epsilon
    static void SetEpsilonAng( float eps );
    static void GetEpsilonAng( float& );

protected:
    void InitLinea();
};

class Linea3D
{
protected:
    Punto3D p1, p2;

public:
    Linea3D() {}
    Linea3D( Punto3D& pa, Punto3D& pb ) { p1=pa; p2=pb; }
    Linea3D( Linea3D &l ) { p1 = l.p1; p2 = l.p2; }
    virtual ~Linea3D() {}
    double GetDistance( const Punto3D& p ) const;
    Linea3D& operator = ( const Linea3D& l ) { p1 = l.p1; p2 = l.p2; return *this; }
    int  operator == ( const Linea3D& l2 ) const;
    int  operator != ( const Linea3D& l2 ) const;
    int  operator & ( const Linea3D& l2 ) const;

protected:
    void InitLinea();
};

typedef TArray ArrayMatrix3;
typedef TArray ArrayPunto2D;
typedef TArray ArrayPunto3D;
typedef TArray ArrayLinea2D;
typedef TArray ArrayLinea3D;

extern "C" double CoeffAng( double xa, double ya, double xb, double yb );

int arcpointlist( Punto2D centro,
	double start, double stop, float raggio, ArrayPunto2D &punti );
int arcpointlist( Punto2D centro,
	double start, double stop, float raggio, ArrayPunto3D &punti );
int ellipseinlist( Punto2D centro, double a, double b, ArrayPunto2D &punti );
int ellipseinlist( Punto2D centro, double a, double b, ArrayPunto3D &punti );

// per programmi che non sono il C++
extern "C"
{
  int arcpointlist( float x, float y,
			double start, double stop, float raggio,
			float *xlist, float *ylist, int maxpunti );
  int ellipseinlist( float x, float y,
			double a, double b,
			float *xlist, float *ylist, int maxpunti );
}

int ArcoPerTrePunti( Punto2D estremo1, Punto2D estremo2, Punto2D p,	ArcInfo &ai );

int Cerchio3Punti( Punto2D estremo1, Punto2D estremo2,
			Punto2D PtMedio, Punto2D& Centro, double& raggio );
int Arco3Punti( Punto2D estremo1, Punto2D estremo2, Punto2D PtMedio,
			Punto2D& Centro, double& raggio, double& AngStart, double& AngStop );

// per programmi che non sono il C++
extern "C"
{
  int ArcoPerTrePunti(
		float p1x, float p1y,
		float p2x, float p2y,
		float p3x, float p3y,
		ArcInfo *ai );
}

#else  // __cplusplus

// eventuali programmi solo C non C++ includono quest sezione

double CoeffAng( double xa, double ya, double xb, double yb );

// funzioni di serializzazione arco in punti
int arcpointlist( float x, float y,
	double start, double stop, float raggio,
	float *xlist, float *ylist, int maxpunti );
int ellipseinlist( float x, float y,
	double a, double b,
	float *xlist, float *ylist, int maxpunti );

// calcolo di un arco che passi per tre punti dati
int ArcoPerTrePunti(
		float p1x, float p1y,
		float p2x, float p2y,
		float p3x, float p3y,
		float* pcx, float* pcy,
		float* raggio
		);

#endif // __cplusplus

#endif //  NMATH__


Generated by: nicola on gulliver.wadahome.it on Sun May 25 13:54:34 2003, using kdoc 2.0a53.