📄 mat_tools.h
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Application Programming Interface //
// //
// Library: SAGA_API //
// //
//-------------------------------------------------------//
// //
// mat_tools.h //
// //
// Copyright (C) 2005 by Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. //
// //
// This library is free software; you can redistribute //
// it and/or modify it under the terms of the GNU Lesser //
// General Public License as published by the Free //
// Software Foundation, version 2.1 of the License. //
// //
// This library is distributed in the hope that it will //
// be useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU Lesser General Public //
// License for more details. //
// //
// You should have received a copy of the GNU Lesser //
// General Public License along with this program; if //
// not, write to the Free Software Foundation, Inc., //
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, //
// USA. //
// //
//-------------------------------------------------------//
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
// e-mail: oconrad@saga-gis.org //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#ifndef HEADER_INCLUDED__SAGA_API__mat_tools_H
#define HEADER_INCLUDED__SAGA_API__mat_tools_H
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#ifndef SWIG
#include <math.h>
#endif // #ifdef SWIG
//---------------------------------------------------------
#include "geo_tools.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#ifndef M_PI
#define M_PI 3.141592653589793
#endif
#define M_PI_045 (M_PI / 4.0)
#define M_PI_090 (M_PI / 2.0)
#define M_PI_135 (M_PI * 3.0 / 4.0)
#define M_PI_180 (M_PI)
#define M_PI_225 (M_PI * 5.0 / 4.0)
#define M_PI_270 (M_PI * 3.0 / 2.0)
#define M_PI_315 (M_PI * 7.0 / 4.0)
#define M_PI_360 (M_PI * 2.0)
#define M_RAD_TO_DEG (180.0 / M_PI)
#define M_DEG_TO_RAD (M_PI / 180.0)
//---------------------------------------------------------
#define M_EULER 2.718281828459045
//---------------------------------------------------------
#define N_MEGABYTE_BYTES 0x100000
//---------------------------------------------------------
#define M_ALMOST_ZERO 0.001l
#define M_TINY (1.0e-20)
//---------------------------------------------------------
#define M_SQR(x) ((x) * (x))
#define M_SQRT(x) sqrt((double)(x))
#define M_GET_LENGTH(x, y) sqrt((double)((x)*(x) + (y)*(y)))
#define M_GET_MIN(a, b) (((a) < (b)) ? (a) : (b))
#define M_GET_MAX(a, b) (((a) > (b)) ? (a) : (b))
#define M_SET_MINMAX(min, max, x) if( min > x ) { min = x; } else if( max < x ) { max = x; }
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
SAGA_API_DLL_EXPORT double SG_Get_Square (double x);
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
typedef int (* TSG_PFNC_Compare) (const int iElement_1, const int iElement_2);
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Index
{
public:
CSG_Index(void);
virtual ~CSG_Index(void);
CSG_Index (int nValues, int *Values, bool bAscending = true);
bool Create (int nValues, int *Values, bool bAscending = true);
CSG_Index (int nValues, double *Values, bool bAscending = true);
bool Create (int nValues, double *Values, bool bAscending = true);
CSG_Index (int nValues, TSG_PFNC_Compare fCompare, bool bAscending = true);
bool Create (int nValues, TSG_PFNC_Compare fCompare, bool bAscending = true);
bool Destroy (void);
bool is_Okay (void) const { return( m_nValues > 0 ); }
int Get_Count (void) const { return( m_nValues ); }
int Get_Index (int i, bool bInv = false) const { return( i >= 0 && i < m_nValues ? m_Index[bInv ? m_nValues-1-i : i] : -1 ); }
int operator [] (int i) const { return( i >= 0 && i < m_nValues ? m_Index[i] : -1 ); }
private:
void *m_Values;
int m_nValues, *m_Index, m_iCompare;
TSG_PFNC_Compare m_fCompare;
void _On_Construction (void);
bool _Set_Array (int nValues);
bool _Set_Index (bool bAscending);
int _Compare (const int iElement_1, const int iElement_2);
};
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Vector
{
public:
CSG_Vector(void);
virtual ~CSG_Vector(void);
CSG_Vector (const CSG_Vector &Vector);
bool Create (const CSG_Vector &Vector);
CSG_Vector (int n, double *Data = NULL);
bool Create (int n, double *Data = NULL);
bool Destroy (void);
int Get_N (void) const { return( m_n ); }
double * Get_Data (void) const { return( m_z ); }
double operator () (int x) const { return( m_z[x] ); }
double & operator [] (int x) { return( m_z[x] ); }
CSG_String asString (void);
bool is_Equal (const CSG_Vector &Vector) const;
bool Assign (double Scalar);
bool Assign (const CSG_Vector &Vector);
bool Add (double Scalar);
bool Add (const CSG_Vector &Vector);
bool Subtract (const CSG_Vector &Vector);
bool Multiply (double Scalar);
bool Multiply (const CSG_Vector &Vector);
double Multiply_Scalar (const CSG_Vector &Vector) const;
bool Multiply (const class CSG_Matrix &Matrix);
bool operator == (const CSG_Vector &Vector) const;
CSG_Vector & operator = (double Scalar);
CSG_Vector & operator = (const CSG_Vector &Vector);
CSG_Vector & operator += (double Scalar);
CSG_Vector & operator += (const CSG_Vector &Vector);
CSG_Vector & operator -= (double Scalar);
CSG_Vector & operator -= (const CSG_Vector &Vector);
CSG_Vector & operator *= (double Scalar);
CSG_Vector & operator *= (const CSG_Vector &Vector);
CSG_Vector & operator *= (const class CSG_Matrix &Matrix);
CSG_Vector operator + (double Scalar) const;
CSG_Vector operator + (const CSG_Vector &Vector) const;
CSG_Vector operator - (double Scalar) const;
CSG_Vector operator - (const CSG_Vector &Vector) const;
CSG_Vector operator * (double Scalar) const;
double operator * (const CSG_Vector &Vector) const;
bool Set_Zero (void);
bool Set_Unity (void);
double Get_Length (void) const;
double Get_Angle (const CSG_Vector &Vector) const;
CSG_Vector Get_Unity (void) const;
private:
int m_n;
double *m_z;
void _On_Construction (void);
};
//---------------------------------------------------------
SAGA_API_DLL_EXPORT CSG_Vector operator * (double Scalar, const CSG_Vector &Vector);
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Matrix
{
public:
CSG_Matrix(void);
virtual ~CSG_Matrix(void);
CSG_Matrix (const CSG_Matrix &Matrix);
bool Create (const CSG_Matrix &Matrix);
CSG_Matrix (int nx, int ny, double *Data = NULL);
bool Create (int nx, int ny, double *Data = NULL);
bool Destroy (void);
int Get_NX (void) const { return( m_nx ); }
int Get_NY (void) const { return( m_ny ); }
double ** Get_Data (void) const { return( m_z ); }
double operator () (int y, int x) const { return( m_z[y][x] ); }
double * operator [] (int y) const { return( m_z[y] ); }
CSG_String asString (void);
bool is_Square (void) const { return( m_nx > 0 && m_nx == m_ny ); }
bool is_Equal (const CSG_Matrix &Matrix) const;
bool Assign (double Scalar);
bool Assign (const CSG_Matrix &Matrix);
bool Add (double Scalar);
bool Add (const CSG_Matrix &Matrix);
bool Subtract (const CSG_Matrix &Matrix);
bool Multiply (double Scalar);
CSG_Vector Multiply (const CSG_Vector &Vector) const;
CSG_Matrix Multiply (const CSG_Matrix &Matrix) const;
bool operator == (const CSG_Matrix &Matrix) const;
CSG_Matrix & operator = (double Scalar);
CSG_Matrix & operator = (const CSG_Matrix &Matrix);
CSG_Matrix & operator += (double Scalar);
CSG_Matrix & operator += (const CSG_Matrix &Matrix);
CSG_Matrix & operator -= (double Scalar);
CSG_Matrix & operator -= (const CSG_Matrix &Matrix);
CSG_Matrix & operator *= (double Scalar);
CSG_Matrix & operator *= (const CSG_Matrix &Matrix);
CSG_Matrix operator + (double Scalar) const;
CSG_Matrix operator + (const CSG_Matrix &Matrix) const;
CSG_Matrix operator - (double Scalar) const;
CSG_Matrix operator - (const CSG_Matrix &Matrix) const;
CSG_Matrix operator * (double Scalar) const;
CSG_Vector operator * (const CSG_Vector &Vector) const;
CSG_Matrix operator * (const CSG_Matrix &Matrix) const;
bool Set_Zero (void);
bool Set_Identity (void);
bool Set_Transpose (void);
bool Set_Inverse (bool bSilent = true, int nSubSquare = 0);
double Get_Determinant (void) const;
CSG_Matrix Get_Transpose (void) const;
CSG_Matrix Get_Inverse (bool bSilent = true, int nSubSquare = 0) const;
private:
int m_nx, m_ny;
double **m_z;
void _On_Construction (void);
};
//---------------------------------------------------------
SAGA_API_DLL_EXPORT CSG_Matrix operator * (double Scalar, const CSG_Matrix &Matrix);
//---------------------------------------------------------
SAGA_API_DLL_EXPORT bool SG_Matrix_Solve (CSG_Matrix &Matrix, CSG_Vector &Vector, bool bSilent = true);
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
class SAGA_API_DLL_EXPORT CSG_Grid_Radius
{
public:
CSG_Grid_Radius(int maxRadius = 0);
~CSG_Grid_Radius(void);
bool Create (int maxRadius);
void Destroy (void);
int Get_Maximum (void) { return( m_maxRadius ); }
int Get_nPoints (void) { return( m_nPoints ); }
int Get_nPoints (int iRadius) { return( iRadius >= 0 && iRadius < m_maxRadius ? m_nPoints_R[iRadius] : 0 ); }
double Get_Point (int iPoint, int &x, int &y)
{
if( iPoint >= 0 && iPoint < m_nPoints )
{
x = m_Points[iPoint].x;
y = m_Points[iPoint].y;
return( m_Points[iPoint].d ); // Distance...
}
return( -1.0 );
}
double Get_Point (int iPoint, int xOffset, int yOffset, int &x, int &y)
{
double d;
if( (d = Get_Point(iPoint, x, y)) >= 0.0 )
{
x += xOffset;
y += yOffset;
}
return( d );
}
double Get_Point (int iRadius, int iPoint, int &x, int &y)
{
if( iRadius >= 0 && iRadius <= m_maxRadius && iPoint >= 0 && iPoint < m_nPoints_R[iRadius] )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -