[QGIS Commit] r15063 - branches/raster-providers/src/core

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Jan 21 05:51:17 EST 2011


Author: rblazek
Date: 2011-01-21 02:51:17 -0800 (Fri, 21 Jan 2011)
New Revision: 15063

Modified:
   branches/raster-providers/src/core/qgsrasterprojector.cpp
   branches/raster-providers/src/core/qgsrasterprojector.h
Log:
more projection optimization but little gain

Modified: branches/raster-providers/src/core/qgsrasterprojector.cpp
===================================================================
--- branches/raster-providers/src/core/qgsrasterprojector.cpp	2011-01-21 09:37:14 UTC (rev 15062)
+++ branches/raster-providers/src/core/qgsrasterprojector.cpp	2011-01-21 10:51:17 UTC (rev 15063)
@@ -95,6 +95,19 @@
   calcSrcRowsCols();
   mSrcXRes = mSrcExtent.height() / mSrcRows;
   mSrcYRes = mSrcExtent.width() / mSrcCols;
+
+  // init helper points 
+  //mHelperTop.resize ( mDestCols );
+  //mHelperBottom.resize ( mDestCols );
+  for ( int i = 0; i < mDestCols; i++) {
+    mHelperTop.append ( QgsPoint() );
+    mHelperBottom.append ( QgsPoint() );
+  }
+  pHelperTop = &mHelperTop;
+  pHelperBottom = &mHelperBottom;
+  calcHelper ( 0, &mHelperTop );
+  calcHelper ( 1, &mHelperBottom );
+  mHelperTopRow = 0;
 }
 
 QgsRasterProjector::~QgsRasterProjector ()
@@ -188,23 +201,79 @@
   return QgsPoint();
 }
 
+
+void QgsRasterProjector::calcHelper ( int theMatrixRow, QList<QgsPoint> *thePoints )
+{
+  // TODO?: should we also precalc dest cell center coordinates for x and y?
+  for ( int myDestCol = 0; myDestCol < mDestCols; myDestCol++) {
+    double myDestX = mDestExtent.xMinimum() + ( myDestCol + 0.5 ) * mDestXRes;
+    //QgsDebugMsg( QString("myDestCol = %1 mDestCols = %2").arg( myDestCol ).arg (mDestCols) );
+    //QgsDebugMsg( QString("myDestX = %1").arg( myDestX ) );
+
+    int myMatrixCol = matrixCol ( myDestCol );
+    //QgsDebugMsg( QString("myMatrixCol = %1 mCPCols = %2").arg( myMatrixCol ).arg(mCPCols) );
+
+    double myDestXMin, myDestYMin, myDestXMax, myDestYMax;
+
+    destPointOnCPMatrix ( theMatrixRow, myMatrixCol, &myDestXMin, &myDestYMin );
+    destPointOnCPMatrix ( theMatrixRow, myMatrixCol + 1, &myDestXMax, &myDestYMax );
+    
+    //QgsDebugMsg( QString("myDestXMin = %1 myDestXMax= %2").arg( myDestXMin ).arg( myDestXMax) );
+
+    double xfrac = ( myDestX - myDestXMin ) / ( myDestXMax - myDestXMin );
+
+    //QgsPoint *mySrcPoint0 = &(mCPMatrix[theMatrixRow+1][myMatrixCol]);
+    //QgsPoint *mySrcPoint1 = &(mCPMatrix[theMatrixRow+1][myMatrixCol+1]);
+    QgsPoint *mySrcPoint0 = &(mCPMatrix[theMatrixRow][myMatrixCol]);
+    QgsPoint *mySrcPoint1 = &(mCPMatrix[theMatrixRow][myMatrixCol+1]);
+    //QgsPoint *mySrcPoint2 = &(mCPMatrix[theMatrixRow][myMatrixCol]);
+    //QgsPoint *mySrcPoint3 = &(mCPMatrix[theMatrixRow][myMatrixCol+1]);
+
+    double s = mySrcPoint0->x() + ( mySrcPoint1->x() - mySrcPoint0->x() ) * xfrac;
+    double t = mySrcPoint0->y() + ( mySrcPoint1->y() - mySrcPoint0->y() ) * xfrac; 
+
+    //QgsDebugMsg( QString("s = %1 t = %2").arg(s).arg(t) );
+    //double u = mySrcPoint2->x() + ( mySrcPoint3->x() - mySrcPoint2->x() ) * xfrac;
+    //double v = mySrcPoint2->y() + ( mySrcPoint3->y() - mySrcPoint2->y() ) * xfrac; 
+
+    //QgsDebugMsg( QString("thePoints = %1").arg ( (long)thePoints ) );
+    (*thePoints)[myDestCol].setX ( s );
+    (*thePoints)[myDestCol].setY ( t );
+    //thePoints->at(myDestCol).setX ( s );
+    //thePoints->at(myDestCol).setY ( t );
+    //QgsDebugMsg( QString("thePoints[myDestCol] = %1").arg( (*thePoints)[myDestCol].toString() ) );
+  }
+}
+void QgsRasterProjector::nextHelper ()
+{
+  //QgsDebugMsg( QString("mHelperTopRow = %1").arg(mHelperTopRow) );
+  QList <QgsPoint> *tmp;
+  tmp = pHelperTop;
+  pHelperTop = pHelperBottom;
+  pHelperBottom = tmp;
+  calcHelper ( mHelperTopRow+2, pHelperBottom );
+  mHelperTopRow++;
+}
+
 void QgsRasterProjector::srcRowCol ( int theDestRow, int theDestCol, int *theSrcRow, int *theSrcCol )
 {
   //QgsDebugMsg( QString("theDestRow = %1 theDestCol = %2").arg( theDestRow).arg(theDestCol) );
-  double myDestX = mDestExtent.xMinimum() + ( theDestCol + 0.5 ) * mDestXRes;
+  int myMatrixRow = matrixRow ( theDestRow );
+  int myMatrixCol = matrixCol ( theDestCol );
+
+  if ( myMatrixRow > mHelperTopRow ) {
+    nextHelper ();
+  }
+
+  //double myDestX = mDestExtent.xMinimum() + ( theDestCol + 0.5 ) * mDestXRes;
   double myDestY = mDestExtent.yMaximum() - ( theDestRow + 0.5 ) * mDestYRes;
 
   //QgsDebugMsg( QString("myDestX = %1 myDestY = %2").arg( myDestX ).arg( myDestY) );
-  int myMatrixRow = matrixRow ( theDestRow );
-  int myMatrixCol = matrixCol ( theDestCol );
 
   //QgsDebugMsg( QString("myMatrixRow = %1 myMatrixCol = %2 mCPRows = %3 mCPCols = %4").arg( myMatrixRow ).arg( myMatrixCol).arg(mCPRows).arg(mCPCols) );
 
   // See the schema in javax.media.jai.WarpGrid doc (but up side down)
   // TODO: use some kind of cache of values which can be reused
-  //QgsPoint myDestLL = destPointOnCPMatrix ( myMatrixRow + 1, myMatrixCol );
-  //QgsPoint myDestUR = destPointOnCPMatrix ( myMatrixRow, myMatrixCol + 1 );
-
   double myDestXMin, myDestYMin, myDestXMax, myDestYMax;
 
   destPointOnCPMatrix ( myMatrixRow + 1, myMatrixCol, &myDestXMin, &myDestYMin );
@@ -219,26 +288,34 @@
 
   //QgsDebugMsg( "mySrcPoint : " + mySrcPoint0.toString() + " " + mySrcPoint1.toString() + " " +mySrcPoint2.toString() + " " + mySrcPoint3.toString() + " " );
 
-  //double xfrac = ( myDestX - myDestLL.x() ) / ( myDestUR.x() - myDestLL.x() );
-  //double yfrac = ( myDestY - myDestLL.y() ) / ( myDestUR.y() - myDestLL.y() );
-  double xfrac = ( myDestX - myDestXMin ) / ( myDestXMax - myDestXMin );
+  //double xfrac = ( myDestX - myDestXMin ) / ( myDestXMax - myDestXMin );
   double yfrac = ( myDestY - myDestYMin ) / ( myDestYMax - myDestYMin );
   //QgsDebugMsg( QString("xfrac = %1 yfrac = %2").arg(xfrac).arg(yfrac) );
   //assert ( xfrac >= 0 );
   //assert ( yfrac >= 0 );
   
-  double s = mySrcPoint0->x() + ( mySrcPoint1->x() - mySrcPoint0->x() ) * xfrac;
-  double t = mySrcPoint0->y() + ( mySrcPoint1->y() - mySrcPoint0->y() ) * xfrac; 
+  //double s = mySrcPoint0->x() + ( mySrcPoint1->x() - mySrcPoint0->x() ) * xfrac;
+  //double t = mySrcPoint0->y() + ( mySrcPoint1->y() - mySrcPoint0->y() ) * xfrac; 
 
-  double u = mySrcPoint2->x() + ( mySrcPoint3->x() - mySrcPoint2->x() ) * xfrac;
-  double v = mySrcPoint2->y() + ( mySrcPoint3->y() - mySrcPoint2->y() ) * xfrac; 
+  //double u = mySrcPoint2->x() + ( mySrcPoint3->x() - mySrcPoint2->x() ) * xfrac;
+  //double v = mySrcPoint2->y() + ( mySrcPoint3->y() - mySrcPoint2->y() ) * xfrac; 
 
-  double mySrcX = s + (u - s) * yfrac;
-  double mySrcY = t + (v - t) * yfrac;
-
   //QgsDebugMsg( QString("s = %1 t = %2").arg(s).arg(t) );
   //QgsDebugMsg( QString("u = %1 v = %2").arg(u).arg(v) );
 
+  QgsPoint *myTop = &((*pHelperTop)[theDestCol]);
+  QgsPoint *myBot = &((*pHelperBottom)[theDestCol]);
+
+  //QgsDebugMsg( QString("s = %1 t = %2 myTop = %3").arg(s).arg(t).arg ( myTop->toString() ) );
+  //QgsDebugMsg( QString("u = %1 v = %2 myBot = %3").arg(u).arg(v).arg ( myBot->toString() ) );
+  
+  //double mySrcX = s + (u - s) * yfrac;
+  //double mySrcY = t + (v - t) * yfrac;
+
+  double mySrcX = myBot->x() + (myTop->x() - myBot->x()) * yfrac;
+  double mySrcY = myBot->y() + (myTop->y() - myBot->y()) * yfrac;
+
+
   //QgsDebugMsg( QString("mySrcX = %1 mySrcY = %2").arg(mySrcX).arg(mySrcY) );
 
   // TODO: check again cell selection (coor is in the middle)
@@ -289,15 +366,15 @@
 
 void QgsRasterProjector::calcCP ( int theRow, int theCol ) 
 {
-  QgsDebugMsg( QString("theRow = %1 theCol = %2").arg(theRow).arg(theCol) );
+  //QgsDebugMsg( QString("theRow = %1 theCol = %2").arg(theRow).arg(theCol) );
   //QgsPoint myDestPoint = destPointOnCPMatrix ( theRow, theCol );
   double myDestX, myDestY;
   destPointOnCPMatrix ( theRow, theCol, &myDestX, &myDestY  );
   QgsPoint myDestPoint ( myDestX, myDestY ); 
-  QgsDebugMsg( "myDestPoint : " + myDestPoint.toString() );
+  //QgsDebugMsg( "myDestPoint : " + myDestPoint.toString() );
 
   mCPMatrix[theRow][theCol] = mCoordinateTransform->transform( myDestPoint ); 
-  QgsDebugMsg( QString("x = %1 y = %2").arg( mCPMatrix[theRow][theCol].x() ).arg( mCPMatrix[theRow][theCol].y() ) );
+  //QgsDebugMsg( QString("x = %1 y = %2").arg( mCPMatrix[theRow][theCol].x() ).arg( mCPMatrix[theRow][theCol].y() ) );
 }
 
 bool QgsRasterProjector::calcRow( int theRow )
@@ -318,7 +395,7 @@
 
 bool QgsRasterProjector::checkCols()
 {
-  QgsDebugMsg( "Entered" );
+  //QgsDebugMsg( "Entered" );
   for ( int c = 0; c < mCPCols; c++) {
     for ( int r = 1; r < mCPRows-1; r += 2 ) {
       //QgsPoint myDestPoint = destPointOnCPMatrix ( r, c );
@@ -342,7 +419,7 @@
 
 bool QgsRasterProjector::checkRows()
 {
-  QgsDebugMsg( "Entered" );
+  //QgsDebugMsg( "Entered" );
   for ( int r = 0; r < mCPRows; r++) {
     for ( int c = 1; c < mCPCols-1; c += 2 ) {
       //QgsPoint myDestPoint = destPointOnCPMatrix ( r, c );

Modified: branches/raster-providers/src/core/qgsrasterprojector.h
===================================================================
--- branches/raster-providers/src/core/qgsrasterprojector.h	2011-01-21 09:37:14 UTC (rev 15062)
+++ branches/raster-providers/src/core/qgsrasterprojector.h	2011-01-21 10:51:17 UTC (rev 15063)
@@ -106,6 +106,12 @@
       * returns true if within threshold */
     bool checkRows ();
 
+    /** Calculate array of src helper points */
+    void calcHelper ( int theMatrixRow, QList<QgsPoint> *thePoints );
+
+    /** Calc / switch helper */
+    void nextHelper();
+
     /** \brief get point for matrix position */
     //QgsPoint matrixPoint ( int theRow, int theCol ) { return QgsPoint ( mCPMatrix[theRow][theCol][0], mCPMatrix[theRow][theCol][1] ); }
 
@@ -171,6 +177,17 @@
     QList< QList<QgsPoint> > mCPMatrix;
     //QList< QList<double *> > mCPMatrix;
 
+    /** Array of source points for each destination column on top of current CPMatrix grid row */
+    QList <QgsPoint> mHelperTop;
+    QList <QgsPoint> *pHelperTop;
+
+    /** Array of source points for each destination column on bottom of current CPMatrix grid row */
+    QList <QgsPoint> mHelperBottom;
+    QList <QgsPoint> *pHelperBottom;
+
+    /** Current mHelperTop matrix row */
+    int mHelperTopRow;
+
     /** Number of mCPMatrix columns */
     int mCPCols;
     /** Number of mCPMatrix rows */



More information about the QGIS-commit mailing list