Stefan Schuermans commited on 2013-01-26 23:31:12
Showing 1 changed files, with 33 additions and 3 deletions.
... | ... |
@@ -26,16 +26,20 @@ Path & Layer::addPath() |
26 | 26 |
*/ |
27 | 27 |
void Layer::improvePaths(double eqDist) |
28 | 28 |
{ |
29 |
- Paths::iterator path, other; |
|
29 |
+ Paths::iterator path, other, best; |
|
30 | 30 |
bool change; |
31 |
+ double smallest, dist; |
|
31 | 32 |
|
32 | 33 |
// join paths with equal begin/end points |
33 | 34 |
do { |
34 | 35 |
change = false; |
36 |
+ // process all paths |
|
35 | 37 |
for (path = mPaths.begin(); path != mPaths.end(); ++path) { |
38 |
+ // check all paths following aftet the current one |
|
36 | 39 |
other = path; |
37 | 40 |
++other; |
38 | 41 |
while (other != mPaths.end()) { |
42 |
+ // paths can be joined |
|
39 | 43 |
if (other->mPoints.front().equals(path->mPoints.back(), |
40 | 44 |
eqDist)) { |
41 | 45 |
path->appendPath(*other); |
... | ... |
@@ -60,10 +64,11 @@ void Layer::improvePaths(double eqDist) |
60 | 64 |
other = mPaths.erase(other); |
61 | 65 |
change = true; |
62 | 66 |
} |
67 |
+ // paths cannot be joined -> move to next one |
|
63 | 68 |
else |
64 | 69 |
++other; |
65 |
- } |
|
66 |
- } |
|
70 |
+ } // while other |
|
71 |
+ } // for path |
|
67 | 72 |
} while (change); |
68 | 73 |
|
69 | 74 |
// remove nearby points in paths |
... | ... |
@@ -77,6 +82,31 @@ void Layer::improvePaths(double eqDist) |
77 | 82 |
path = mPaths.erase(path); |
78 | 83 |
else |
79 | 84 |
++path; |
85 |
+ |
|
86 |
+ // sort paths to minimize unproductive move distance |
|
87 |
+ for (path = mPaths.begin(); path != mPaths.end(); ++path) { |
|
88 |
+ // find path starting at closest distance from current paths end |
|
89 |
+ other = path; |
|
90 |
+ ++other; |
|
91 |
+ best = mPaths.end(); |
|
92 |
+ while (other != mPaths.end()) { |
|
93 |
+ // calculate (squared) distance from path.end to other.begin |
|
94 |
+ // path and other are never empty here |
|
95 |
+ // empty paths have been removed before |
|
96 |
+ dist = (path->mPoints.back() - other->mPoints.front()).abs_sq(); |
|
97 |
+ // keep path with smallest (squared) distance |
|
98 |
+ if (best == mPaths.end() || dist < smallest) { |
|
99 |
+ best = other; |
|
100 |
+ smallest = dist; |
|
101 |
+ } |
|
102 |
+ ++other; |
|
103 |
+ } // while other |
|
104 |
+ // use best path as next one, i.e. swap best path with next one |
|
105 |
+ other = path; |
|
106 |
+ other++; |
|
107 |
+ if (other != mPaths.end() && best != mPaths.end()) |
|
108 |
+ mPaths.splice(other, mPaths, best); |
|
109 |
+ } // for path |
|
80 | 110 |
} |
81 | 111 |
|
82 | 112 |
/** |
83 | 113 |