comparison src/Path.cpp @ 188:487261a22b18 re-minimise

distance_t * diagonalWeight might not fit in distance_t; use pathcost_t for it. Also remove C-style casts.
author Chris Cannam
date Thu, 26 Feb 2015 12:19:17 +0000
parents 16870e8770ae
children 175c8f044e7c
comparison
equal deleted inserted replaced
187:ba0d2104abec 188:487261a22b18
17 #include "Path.h" 17 #include "Path.h"
18 18
19 int 19 int
20 Path::smooth(std::vector<int> &x, std::vector<int> &y, int length) 20 Path::smooth(std::vector<int> &x, std::vector<int> &y, int length)
21 { 21 {
22 if (length == 0) 22 if (length <= 0)
23 return 0; 23 return 0;
24 while ((int)val.size() < length) { 24 while (m_val.size() < static_cast<std::vector<int>::size_type>(length)) {
25 val.push_back(0); 25 m_val.push_back(0);
26 len.push_back(0); 26 m_len.push_back(0);
27 } 27 }
28 int p = 0; 28 int p = 0;
29 val[0] = len[0] = 0; 29 m_val[0] = m_len[0] = 0;
30 for (int i = 1; i < length; i++) { // H = 1; V = 2; D = 3 30 for (int i = 1; i < length; i++) { // H = 1; V = 2; D = 3
31 int current = x[i] - x[i-1] + 2 * (y[i] - y[i-1]); 31 int current = x[i] - x[i-1] + 2 * (y[i] - y[i-1]);
32 if (current == val[p]) { 32 if (current == m_val[p]) {
33 len[p]++; 33 m_len[p]++;
34 } else if ((current == 3) || (val[p] == 0)) { 34 } else if ((current == 3) || (m_val[p] == 0)) {
35 val[++p] = current; 35 m_val[++p] = current;
36 len[p] = 1; 36 m_len[p] = 1;
37 } else if (val[p] + current == 3) { // 1 + 2 37 } else if (m_val[p] + current == 3) { // 1 + 2
38 if (--len[p] == 0) 38 if (--m_len[p] == 0)
39 p--; 39 p--;
40 if (val[p] == 3) 40 if (m_val[p] == 3)
41 len[p]++; 41 m_len[p]++;
42 else { 42 else {
43 val[++p] = 3; 43 m_val[++p] = 3;
44 len[p] = 1; 44 m_len[p] = 1;
45 } 45 }
46 } else { // val[p] == 3 && current != 3 46 } else { // m_val[p] == 3 && current != 3
47 if ((val[p-1] == current) || 47 if ((m_val[p-1] == current) ||
48 (val[p-1] == 0) || 48 (m_val[p-1] == 0) ||
49 (len[p] > MAX_RUN_LENGTH)) { 49 (m_len[p] > MAX_RUN_LENGTH)) {
50 val[++p] = current; 50 m_val[++p] = current;
51 len[p] = 1; 51 m_len[p] = 1;
52 } else { 52 } else {
53 if (--len[p-1] == 0) { 53 if (--m_len[p-1] == 0) {
54 val[p-1] = val[p]; 54 m_val[p-1] = m_val[p];
55 len[p-1] = len[p]; 55 m_len[p-1] = m_len[p];
56 p--; 56 p--;
57 if (val[p-1] == 3) { 57 if (m_val[p-1] == 3) {
58 len[p-1] += len[p]; 58 m_len[p-1] += m_len[p];
59 p--; 59 p--;
60 } 60 }
61 } 61 }
62 len[p]++; 62 m_len[p]++;
63 } 63 }
64 } 64 }
65 } 65 }
66 int i = 1; 66 int i = 1;
67 for (int pp = 1; pp <= p; pp++) { 67 for (int pp = 1; pp <= p; pp++) {
68 int dx = val[pp] & 1; 68 int dx = m_val[pp] & 1;
69 int dy = val[pp] >> 1; 69 int dy = m_val[pp] >> 1;
70 for (int j = len[pp]; j > 0; j--, i++) { 70 for (int j = m_len[pp]; j > 0; j--, i++) {
71 x[i] = x[i-1] + dx; 71 x[i] = x[i-1] + dx;
72 y[i] = y[i-1] + dy; 72 y[i] = y[i-1] + dy;
73 } 73 }
74 } 74 }
75 return i; 75 return i;