changeset 120:c7aa54343131 adaptive_diagonals

Use end point when recalculating with pin points
author Chris Cannam
date Fri, 05 Dec 2014 15:19:48 +0000
parents 96c2191a85cc
children 14a1664d1cfe
files src/Finder.cpp src/Finder.h
diffstat 2 files changed, 48 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/Finder.cpp	Fri Dec 05 14:49:57 2014 +0000
+++ b/src/Finder.cpp	Fri Dec 05 15:19:48 2014 +0000
@@ -308,7 +308,13 @@
         for (int j = -4; j <= 0; ++j) {
             cerr << setw(w) << j;
             for (int i = -4; i <= 0; ++i) {
-                cerr << setw(ww) << m_m->getDistance(err.r + j, err.c + i);
+                int r = err.r + j;
+                int c = err.c + i;
+                float dist = 0.f;
+                if (r >= 0 && c >= 0) {
+                    dist = m_m->getDistance(r, c);
+                }
+                cerr << setw(ww) << dist;
             }
             cerr << endl;
         }
@@ -323,7 +329,13 @@
         for (int j = -4; j <= 0; ++j) {
             cerr << setw(w) << j;
             for (int i = -4; i <= 0; ++i) {
-                cerr << setw(ww) << m_m->getPathCost(err.r + j, err.c + i);
+                int r = err.r + j;
+                int c = err.c + i;
+                double cost = 0.0;
+                if (r >= 0 && c >= 0) {
+                    cost = m_m->getPathCost(r, c);
+                }
+                cerr << setw(ww) << cost;
             }
             cerr << endl;
         }
@@ -333,18 +345,8 @@
 #endif
 
 void
-Finder::retrievePath(vector<int> &pathx,
-                     vector<int> &pathy,
-                     vector<float> &distances)
+Finder::getEndPoint(int &x, int &y)
 {
-    pathx.clear();
-    pathy.clear();
-    distances.clear();
-
-#ifdef PERFORM_ERROR_CHECKS
-//    checkAndReport();
-#endif
-
     int ex = m_m->getOtherFrameCount() - 1;
     int ey = m_m->getFrameCount() - 1;
 
@@ -352,8 +354,8 @@
         return;
     }
     
-    int x = ex;
-    int y = ey;
+    x = ex;
+    y = ey;
 
     if (m_duration2 > 0 && m_duration2 < m_m->getOtherFrameCount()) {
         x = m_duration2 - 1;
@@ -373,10 +375,25 @@
         x = ex;
         y = ey;
     }
+}
 
-//    recalculatePathCostMatrix(0, 0, y, x);
+void
+Finder::retrievePath(vector<int> &pathx,
+                     vector<int> &pathy,
+                     vector<float> &distances)
+{
+    pathx.clear();
+    pathy.clear();
+    distances.clear();
+
+#ifdef PERFORM_ERROR_CHECKS
+    checkAndReport();
+#endif
 
 //    cerr << "start: x = " << x << ", y = " << y << endl;
+
+    int x, y;
+    getEndPoint(x, y);
     
     while (m_m->isAvailable(y, x) && (x > 0 || y > 0)) {
 
@@ -436,6 +453,9 @@
 
     if (pinpoints.size() < 2) return;
 
+    int ex, ey;
+    getEndPoint(ex, ey);
+    
     pair<int, int> prev = *pinpoints.begin();
 
     for (PPMap::const_iterator i = pinpoints.begin(); i != pinpoints.end(); ++i) {
@@ -443,8 +463,16 @@
 
         pair<int, int> curr = *i;
 
-        recalculatePathCostMatrix(prev.second, prev.first,
-                                  curr.second, curr.first, 1.0);
+        if (curr.first > ex || curr.second > ey) {
+
+            recalculatePathCostMatrix(prev.second, prev.first,
+                                      ey, ex, 1.0);
+
+        } else {
+        
+            recalculatePathCostMatrix(prev.second, prev.first,
+                                      curr.second, curr.first, 1.0);
+        }
         
         prev = curr;
     }
--- a/src/Finder.h	Fri Dec 05 14:49:57 2014 +0000
+++ b/src/Finder.h	Fri Dec 05 15:19:48 2014 +0000
@@ -89,6 +89,8 @@
 
     void recalculatePathCostMatrix(int r1, int c1, int r2, int c2,
                                    float diagonalWeight);
+
+    void getEndPoint(int &x, int &y);
     
     Matcher *m_m;
     int m_duration1;