00001
00058 #ifndef INC_SPATMOD_IMAGEFILTERFOCALTOPOGRAPHIC_H
00059 #define INC_SPATMOD_IMAGEFILTERFOCALTOPOGRAPHIC_H
00060
00061 #ifndef INC_SPATMOD_IMAGEFILTER_H
00062 #include <spatmod/imagefilter.h>
00063 #endif
00064
00065 #ifndef INC_SPATMOD_IMAGEBUFFER_H
00066 #include <spatmod/imagebuffer.h>
00067 #endif
00068
00069 #ifndef INC_MI32_POINT_H
00070 #include <mi32/point.h>
00071 #endif
00072
00073
00074
00075
00076 #define GRADGRAYSIZE 65535
00077
00078 namespace SPATMOD {
00079 namespace IMAGE {
00080
00081
00082
00084 class FILTER_FOCALTOPOGRAPHIC : public FILTER {
00085 public:
00086
00088 enum SURFACE_FITTING_METHOD {
00089 SURFACE_FITTING_METHOD_FourNearest = 0,
00090 SURFACE_FITTING_METHOD_QLSF = 1,
00091 SURFACE_FITTING_METHOD_QLSFOverDistance = 2,
00092 SURFACE_FITTING_METHOD_QLSFOverDistanceSquared = 3,
00093 SURFACE_FITTING_METHOD_QLSFMatchCentral = 4
00094
00095 };
00096
00098 enum SLOPE_UNITS {
00099 SLOPE_UNITS_Percent,
00100 SLOPE_UNITS_Degrees
00101 };
00102
00104 enum SHADING_METHOD {
00105 SHADING_METHOD_HighContrast = 0,
00106 SHADING_METHOD_Display = 1
00107
00108 };
00109
00111 enum CURVATURE_UNITS {
00112 CURVATURE_UNITS_RadiansPerMeter,
00113 CURVATURE_UNITS_RadiansPer100Meter
00114 };
00115
00117 class SETTINGS {
00118 public:
00119
00121 SETTINGS ( ) :
00122 m_SurfaceFitMethod(SURFACE_FITTING_METHOD_FourNearest),
00123 m_DoSlope(false),
00124 m_SlopeDataType(SPATMOD::DATATYPE_FLOAT32),
00125 m_SlopeUnits(FILTER_FOCALTOPOGRAPHIC::SLOPE_UNITS_Degrees),
00126 m_DoAspect(false),
00127 m_AspectDataType(SPATMOD::DATATYPE_SINT16),
00128 m_DoShading(false),
00129 m_ShadingDataType(SPATMOD::DATATYPE_UINT8),
00130 m_ShadingMethod(FILTER_FOCALTOPOGRAPHIC::SHADING_METHOD_Display),
00131 m_DoProfile(false),
00132 m_DoPlan(false),
00133 m_CurvatureDataType(SPATMOD::DATATYPE_FLOAT32),
00134 m_CurvatureUnits(FILTER_FOCALTOPOGRAPHIC::CURVATURE_UNITS_RadiansPerMeter),
00135 m_XCellSize(0.0),
00136 m_YCellSize(0.0),
00137 m_ElevationScale(1.0),
00138 m_ElevationAngleOfSun(45.0*DEGTORAD),
00139 m_DirectionOfSun(50.0*DEGTORAD)
00140 { }
00141
00142 ~SETTINGS () { }
00143
00145 void SetSurfaceFittingMethod ( SURFACE_FITTING_METHOD method ) { m_SurfaceFitMethod = method; }
00146
00148 void SetSlopeParms (
00149 bool DoSlope,
00150 SPATMOD::DATATYPE type = SPATMOD::DATATYPE_SINT16,
00151 SLOPE_UNITS units = FILTER_FOCALTOPOGRAPHIC::SLOPE_UNITS_Degrees
00152 ) {
00153 SetDoSlope(DoSlope);
00154 SetSlopeDataType(type);
00155 SetSlopeUnits(units);
00156 }
00157
00159 void SetDoSlope ( bool DoSlope ) { m_DoSlope = DoSlope; };
00160
00162 void SetSlopeDataType ( SPATMOD::DATATYPE type ) { m_SlopeDataType = type; };
00163
00165 void SetSlopeUnits ( SLOPE_UNITS units ) { m_SlopeUnits = units; };
00166
00168 void SetAspectParms (
00169 bool DoAspect,
00170 SPATMOD::DATATYPE type = SPATMOD::DATATYPE_FLOAT32
00171 ) {
00172 SetDoAspect(DoAspect);
00173 SetAspectDataType(type);
00174 }
00175
00177 void SetDoAspect ( bool DoAspect ) { m_DoAspect = DoAspect; };
00178
00180 void SetAspectDataType ( SPATMOD::DATATYPE type ) { m_AspectDataType = type; };
00181
00183 void SetShadingParms (
00184 bool DoShading,
00185 SPATMOD::DATATYPE type = SPATMOD::DATATYPE_UINT8,
00186 SHADING_METHOD method = FILTER_FOCALTOPOGRAPHIC::SHADING_METHOD_Display
00187 ) {
00188 SetDoShading(DoShading);
00189 SetShadingDataType(type);
00190 SetShadingMethod(method);
00191 }
00192
00194 void SetDoShading ( bool DoShading ) { m_DoShading = DoShading; };
00195
00197 void SetShadingDataType ( SPATMOD::DATATYPE type ) { m_ShadingDataType = type; };
00198
00199 void SetShadingMethod ( SHADING_METHOD method ) { m_ShadingMethod = method; };
00200
00202 void SetCurvatureParms (
00203 bool DoProfile,
00204 bool DoPlan,
00205 SPATMOD::DATATYPE type = SPATMOD::DATATYPE_SINT16,
00206 CURVATURE_UNITS units = FILTER_FOCALTOPOGRAPHIC::CURVATURE_UNITS_RadiansPerMeter
00207 ) {
00208 SetDoProfile(DoProfile);
00209 SetDoPlan(DoPlan);
00210 SetCurvatureDataType(type);
00211 SetCurvatureUnits(units);
00212 }
00213
00215 void SetDoProfile ( bool DoProfile ) { m_DoProfile = DoProfile; };
00216
00218 void SetDoPlan ( bool DoPlan ) { m_DoPlan = DoPlan; };
00219
00221 void SetCurvatureDataType ( SPATMOD::DATATYPE type ) { m_CurvatureDataType = type; };
00222
00224 void SetCurvatureUnits ( CURVATURE_UNITS units ) { m_CurvatureUnits = units; };
00225
00227 void SetXCellSize ( double scale ) { m_XCellSize = scale; };
00228
00230 double GetXCellSize ( ) { return (m_XCellSize); };
00231
00233 void SetYCellSize ( double scale ) { m_YCellSize = scale; };
00234
00236 double GetYCellSize ( ) { return (m_YCellSize); };
00237
00239 void SetElevationScale ( double scale ) { m_ElevationScale = scale; };
00240
00242 void SetElevationAngleOfSun (
00243 double angle
00244 ) { m_ElevationAngleOfSun = angle * DEGTORAD; };
00245
00247 void SetDirectionOfSun (
00248 double direction
00249 ) { m_DirectionOfSun = direction * DEGTORAD; };
00250
00251 private:
00252 #ifndef GENERATING_DOXYGEN_OUTPUT
00253 SURFACE_FITTING_METHOD m_SurfaceFitMethod;
00254
00255 bool m_DoSlope;
00256 SPATMOD::DATATYPE m_SlopeDataType;
00257 SLOPE_UNITS m_SlopeUnits;
00258
00259 bool m_DoAspect;
00260 SPATMOD::DATATYPE m_AspectDataType;
00261
00262 bool m_DoShading;
00263 SPATMOD::DATATYPE m_ShadingDataType;
00264 SHADING_METHOD m_ShadingMethod;
00265
00266 bool m_DoProfile;
00267 bool m_DoPlan;
00268 SPATMOD::DATATYPE m_CurvatureDataType;
00269 CURVATURE_UNITS m_CurvatureUnits;
00270
00271 double m_XCellSize;
00272 double m_YCellSize;
00273 double m_ElevationScale;
00274 double m_ElevationAngleOfSun;
00275 double m_DirectionOfSun;
00276
00277 friend class FILTER_FOCALTOPOGRAPHIC;
00278 #endif // GENERATING_DOXYGEN_OUTPUT
00279 };
00280
00282 FILTER_FOCALTOPOGRAPHIC (
00283 STAGE *pPreviousStage,
00284 bool TakeOwnership,
00285 const SETTINGS &settings
00286 );
00287
00289 virtual ~FILTER_FOCALTOPOGRAPHIC ();
00290
00292 void SetSeparatePlanValidity (
00293 bool SeparatePlanValidity
00294 ) { m_SeparatePlanValidity = SeparatePlanValidity; }
00295
00296 protected:
00297
00298 virtual ERRVALUE v_Initialize ();
00299 virtual ERRVALUE v_PullBegin (const SECTION_ITERATOR& iterator);
00300 virtual ERRVALUE v_PullSubSection (const SECTION& section, BUFFER& target);
00301
00302 private:
00303 #ifndef GENERATING_DOXYGEN_OUTPUT
00304
00305 DPOINT3D m_SunVector;
00306 double m_xgradscale;
00307 double m_ygradscale;
00308 UINT8 m_gradgray[GRADGRAYSIZE];
00309 UINT16 m_NumOutputs;
00310 UINT16 m_IdxPlanValidity;
00311 bool m_SeparatePlanValidity;
00312
00313 bool m_bNeedFullKernal;
00314 double m_z[10];
00315
00316
00317 double m_a;
00318 double m_b;
00319 double m_c;
00320 double m_d;
00321 double m_ee;
00322 double m_ProfileDenom;
00323 double m_PlanDenom;
00324
00325 SETTINGS m_Settings;
00326
00327 void ComputeSunVector ();
00328 void ComputeDisplayShadingLookupTable ();
00329 ERRVALUE ComputeCoefficients ();
00330
00331
00332 bool ReadKernel ();
00333 bool IsKernalLevel ();
00334
00335
00336 void ComputeSlope (
00337 SAMPLEITERATOR &Tgt
00338 );
00339 void ComputeAspect (
00340 SAMPLEITERATOR &Tgt
00341 );
00342 void ComputeShading (
00343 SAMPLEITERATOR &Tgt
00344 );
00345 void ComputeCurvatureProfile (
00346 SAMPLEITERATOR &Tgt
00347 );
00348 void ComputeCurvaturePlan (
00349 SAMPLEITERATOR &TgtResult,
00350 UINT8 *pTgtValidity = 0
00351 );
00352
00353
00354 SAMPLEITERATOR* m_itInput;
00355 SIMPLE_ARRAY<UINT8*> m_pValidInput;
00356
00357
00358 FILTER_FOCALTOPOGRAPHIC (const FILTER_FOCALTOPOGRAPHIC&);
00359 FILTER_FOCALTOPOGRAPHIC& operator= (const FILTER_FOCALTOPOGRAPHIC&);
00360 #endif // GENERATING_DOXYGEN_OUTPUT
00361 };
00362
00363
00364
00365 }
00366 }
00367
00368 #endif // INC_SPATMOD_IMAGEFILTERFOCALTOPOGRAPHIC_H
00369