diff options
| author | Johan B. C. Engelen <jbc.engelen@swissonline.ch> | 2009-04-06 22:29:34 +0000 |
|---|---|---|
| committer | johanengelen <johanengelen@users.sourceforge.net> | 2009-04-06 22:29:34 +0000 |
| commit | 64e50f15e4a4fb6ffcd2aa3774f1b0dde990e99f (patch) | |
| tree | 0fae7298fc26ec9c39d73f1e9b33207c8bb0d9c2 /src/2geom/sweep.cpp | |
| parent | noop: Rename argument from uri to filename for Extension::...::save implement... (diff) | |
| download | inkscape-64e50f15e4a4fb6ffcd2aa3774f1b0dde990e99f.tar.gz inkscape-64e50f15e4a4fb6ffcd2aa3774f1b0dde990e99f.zip | |
update 2geom. big commit as it has been a while. (2geom svn rev. 1870, i think)
i turned some optional compilation stuff *on* per default, to help building inkscape.
(bzr r7638)
Diffstat (limited to 'src/2geom/sweep.cpp')
| -rw-r--r-- | src/2geom/sweep.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/src/2geom/sweep.cpp b/src/2geom/sweep.cpp index 227c47e09..7571efe09 100644 --- a/src/2geom/sweep.cpp +++ b/src/2geom/sweep.cpp @@ -8,18 +8,19 @@ namespace Geom { * \brief Make a list of pairs of self intersections in a list of Rects. * * \param rs: vector of Rect. + * \param d: dimension to sweep along * * [(A = rs[i], B = rs[j]) for i,J in enumerate(pairs) for j in J] * then A.left <= B.left */ -std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> rs) { +std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> rs, Dim2 d) { std::vector<Event> events; events.reserve(rs.size()*2); std::vector<std::vector<unsigned> > pairs(rs.size()); for(unsigned i = 0; i < rs.size(); i++) { - events.push_back(Event(rs[i].left(), i, false)); - events.push_back(Event(rs[i].right(), i, true)); + events.push_back(Event(rs[i][d][0], i, false)); + events.push_back(Event(rs[i][d][1], i, true)); } std::sort(events.begin(), events.end()); @@ -33,7 +34,7 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> rs) { } else { for(unsigned j = 0; j < open.size(); j++) { unsigned jx = open[j]; - if(rs[jx][Y].intersects(rs[ix][Y])) { + if(rs[jx][1-d].intersects(rs[ix][1-d])) { pairs[jx].push_back(ix); } } @@ -48,11 +49,12 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> rs) { * * \param a: vector of Rect. * \param b: vector of Rect. + * \param d: dimension to scan along * * [(A = rs[i], B = rs[j]) for i,J in enumerate(pairs) for j in J] * then A.left <= B.left, A in a, B in b */ -std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vector<Rect> b) { +std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vector<Rect> b, Dim2 d) { std::vector<std::vector<unsigned> > pairs(a.size()); if(a.empty() || b.empty()) return pairs; std::vector<Event> events[2]; @@ -64,15 +66,17 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vecto events[n].reserve(sz*2); for(unsigned i = 0; i < sz; i++) { Rect r = n ? b[i] : a[i]; - events[n].push_back(Event(r.left(), i, false)); - events[n].push_back(Event(r.right(), i, true)); + events[n].push_back(Event(r[d][0], i, false)); + events[n].push_back(Event(r[d][1], i, true)); } std::sort(events[n].begin(), events[n].end()); } std::vector<unsigned> open[2]; bool n = events[1].front() < events[0].front(); - for(unsigned i[] = {0,0}; i[n] < events[n].size();) { + {// As elegant as putting the initialiser in the for was, it upsets some legacy compilers (MS VS C++) + unsigned i[] = {0,0}; + for(; i[n] < events[n].size();) { unsigned ix = events[n][i[n]].ix; bool closing = events[n][i[n]].closing; //std::cout << n << "[" << ix << "] - " << (closing ? "closer" : "opener") << "\n"; @@ -84,7 +88,7 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vecto //opening a B, add to all open a for(unsigned j = 0; j < open[0].size(); j++) { unsigned jx = open[0][j]; - if(a[jx][Y].intersects(b[ix][Y])) { + if(a[jx][1-d].intersects(b[ix][1-d])) { pairs[jx].push_back(ix); } } @@ -93,7 +97,7 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vecto //opening an A, add all open b for(unsigned j = 0; j < open[1].size(); j++) { unsigned jx = open[1][j]; - if(b[jx][Y].intersects(a[ix][Y])) { + if(b[jx][1-d].intersects(a[ix][1-d])) { pairs[ix].push_back(jx); } } @@ -103,7 +107,7 @@ std::vector<std::vector<unsigned> > sweep_bounds(std::vector<Rect> a, std::vecto i[n]++; if(i[n]>=events[n].size()) {break;} n = (events[!n][i[!n]] < events[n][i[n]]) ? !n : n; - } + }} return pairs; } |
