QGIS API Documentation  2.0.1-Dufour
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgstotalcurvaturefilter.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstotalcurvaturefilter.h - description
3  -------------------
4  begin : August 21th, 2009
5  copyright : (C) 2009 by Marco Hugentobler
6  email : marco dot hugentobler at karto dot baug dot ethz dot ch
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
19 
20 QgsTotalCurvatureFilter::QgsTotalCurvatureFilter( const QString& inputFile, const QString& outputFile, const QString& outputFormat )
21  : QgsNineCellFilter( inputFile, outputFile, outputFormat )
22 {
23 
24 }
25 
27 {
28 
29 }
30 
31 float QgsTotalCurvatureFilter::processNineCellWindow( float* x11, float* x21, float* x31, float* x12,
32  float* x22, float* x32, float* x13, float* x23, float* x33 )
33 {
34  //return nodata if one value is the nodata value
35  if ( *x11 == mInputNodataValue || *x21 == mInputNodataValue || *x31 == mInputNodataValue || *x12 == mInputNodataValue
36  || *x22 == mInputNodataValue || *x32 == mInputNodataValue || *x13 == mInputNodataValue || *x23 == mInputNodataValue
37  || *x33 == mInputNodataValue )
38  {
39  return mOutputNodataValue;
40  }
41 
42  double cellSizeAvg = ( mCellSizeX + mCellSizeY ) / 2.0;
43  double dxx = ( *x32 - 2 * *x22 + *x12 ) / ( mCellSizeX * mCellSizeX );
44  double dyy = ( -*x11 + *x31 + *x13 - *x33 ) / ( 4 * cellSizeAvg * cellSizeAvg );
45  double dxy = ( *x21 - 2 * *x22 + *x23 ) / ( mCellSizeY * mCellSizeY );
46 
47  return dxx*dxx + 2*dxy*dxy + dyy*dyy;
48 }