00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef INC_MI32_KRIGING_H
00022 #define INC_MI32_KRIGING_H
00023
00024 #ifndef INC_MI32_RECT_H
00025 #include <mi32/rect.h>
00026 #endif
00027
00028 #ifndef INC_MI32_VARIOGRAM_H
00029 #include <mi32/variogram.h>
00030 #endif
00031
00032 #ifndef INC_MI32_QTREE_H
00033 #include <mi32/qtree.h>
00034 #endif
00035
00036
00037 #ifndef GENERATING_DOXYGEN_OUTPUT
00038 class MIMATRIX;
00039 #endif // GENERATING_DOXYGEN_OUTPUT
00040
00041
00042 class KRIGING {
00043 public:
00044
00045 enum DRIFTORDER {
00046 DRIFTORDER_OrdinaryKriging = 0,
00047 DRIFTORDER_Linear = 1,
00048 DRIFTORDER_Quadratic = 2,
00049 DRIFTORDER_Cubic = 3,
00050 DRIFTORDER_Quartic = 4,
00051 DRIFTORDER_Quintic = 5
00052 };
00053
00054 enum DUPLICATE {
00055 DUPLICATE_KeepFirst = 0,
00056 DUPLICATE_Discard = 1,
00057 DUPLICATE_Minimum = 2,
00058 DUPLICATE_Average = 3,
00059 DUPLICATE_Maximum = 4,
00060 DUPLICATE_KeepLast = 5
00061 };
00062
00063 KRIGING (
00064 );
00065
00066 ~KRIGING (
00067 ) { Clear(); }
00068
00069 ERRVALUE Init (
00070 const DOUBLE_ARRAY<DPOINT3D>& points,
00071 const DUPLICATE duplicate,
00072 const double tolerance
00073 );
00074
00075 void Clear (
00076 );
00077
00078 ERRVALUE CrossEstimate (
00079 const INT32 index,
00080 double& value,
00081 UINT8& computed
00082 );
00083
00084 ERRVALUE CrossEvaluation (
00085 double& mean,
00086 double& stddev
00087 );
00088
00089 ERRVALUE Estimate (
00090 const DPOINT2D& point,
00091 double& value,
00092 UINT8& computed,
00093 double* error = 0,
00094 double* drift = 0
00095 );
00096
00097 DRIFTORDER GetDriftOrder (
00098 ) const { return m_DriftOrder; }
00099
00100 DUPLICATE GetDuplicate (
00101 ) const { return m_Duplicate; }
00102
00103 double GetHighTrimming (
00104 ) const { return m_HighTrimming; }
00105
00106 INT32 GetMaximumPoints (
00107 ) const { return m_MaximumPoints; }
00108
00109 INT32 GetMinimumPoints (
00110 ) const { return m_MinimumPoints; }
00111
00112 double GetLowTrimming (
00113 ) const { return m_LowTrimming; }
00114
00115 double GetTolerance (
00116 ) const { return m_Tolerance; }
00117
00118 double GetSearchDistance (
00119 ) const { return m_SearchDistance; }
00120
00121 const VARIOGRAM& GetVariogram (
00122 ) const { return m_Variogram; }
00123
00124 VARIOGRAM& GetVariogram (
00125 ) { return m_Variogram; }
00126
00127 bool IsInitialized (
00128 ) const { return m_IsInitialized; }
00129
00130 void SetDriftOrder (
00131 const DRIFTORDER order
00132 ) { m_DriftOrder = order; }
00133
00134 void SetHighTrimming (
00135 const double trimming
00136 );
00137
00138 void SetMinimumPoints (
00139 const INT32 minimum
00140 ) { m_MinimumPoints = minimum; }
00141
00142 void SetMaximumPoints (
00143 const INT32 maximum
00144 ) { m_MaximumPoints = maximum; }
00145
00146 void SetLowTrimming (
00147 const double trimming
00148 );
00149
00150 void SetSearchDistance (
00151 const double distance
00152 ) { m_SearchDistance = distance; m_SearchDistance2 = distance * distance; }
00153
00154 private:
00155 #ifndef GENERATING_DOXYGEN_OUTPUT
00156
00157 bool m_IsInitialized;
00158
00159 DUPLICATE m_Duplicate;
00160 double m_Tolerance;
00161
00162 VARIOGRAM m_Variogram;
00163
00164 double m_SearchDistance;
00165 INT32 m_MinimumPoints;
00166 INT32 m_MaximumPoints;
00167
00168 DRIFTORDER m_DriftOrder;
00169
00170 double m_LowTrimming;
00171 double m_HighTrimming;
00172
00174
00175 DOUBLE_ARRAY<DPOINT3D> m_Points;
00176 QUADTREE m_QTree;
00177 DRECT3D m_Extents;
00178
00180
00181 struct ITEM {
00182 INT32 m_Index;
00183 double m_Distance;
00184 };
00185
00186 double m_SearchDistance2;
00187 double m_MaximumValue;
00188 double m_MinimumValue;
00189
00190 SIMPLE_ARRAY<INT32> m_Indices;
00191 SIMPLE_ARRAY<ITEM> m_Items;
00192 DOUBLE_ARRAY<double> m_Values;
00193
00194 static int CompareItems (const void *vp1, const void *vp2);
00195 static double MIpow (const double v, const int power);
00196 static void GetDriftCoefficients (const INT32 degree, const DPOINT2D& point, DOUBLE_ARRAY<double>& values);
00197 static double GetVariance (const MIMATRIX& B, const MIMATRIX& C);
00198
00199 ERRVALUE FindNearestPoints (const DPOINT2D& point, SIMPLE_ARRAY<INT32>& indices);
00200 ERRVALUE PrepareMatrices (const DPOINT2D& point, const SIMPLE_ARRAY<INT32>& indices, MIMATRIX& M, MIMATRIX& B, MIMATRIX& C);
00201 double ComputeDrift (const MIMATRIX& C, const SIMPLE_ARRAY<INT32>& indices);
00202 double ComputeVariance (const MIMATRIX& B, const MIMATRIX& C);
00203 double Calculate (const MIMATRIX& C, const SIMPLE_ARRAY<INT32>& indices);
00204 double Trimming (const double value) { return bound(value, m_MinimumValue, m_MaximumValue); }
00205 #endif // GENERATING_DOXYGEN_OUTPUT
00206 };
00207
00208 #endif