Mercurial > hg > match-vamp
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; |