~jaspervdg/+junk/aem-diffusion-curves

1 by Jasper van de Gronde
Initial commit
1
#include <2geom/crossing.h>
2
#include <2geom/path.h>
3
4
namespace Geom {
5
6
//bool edge_involved_in(Edge const &e, Crossing const &c) {
7
//    if(e.path == c.a) {
8
//        if(e.time == c.ta) return true;
9
//    } else if(e.path == c.b) {
10
//        if(e.time == c.tb) return true;
11
//    }
12
//    return false;
13
//}
14
15
double wrap_dist(double from, double to, double size, bool rev) {
16
    if(rev) {
17
        if(to > from) {
18
            return from + (size - to);
19
        } else {
20
            return from - to;
21
        }
22
    } else {
23
        if(to < from) {
24
            return to + (size - from);
25
        } else {
26
            return to - from;
27
        }
28
    }
29
}
30
/*
31
CrossingGraph create_crossing_graph(std::vector<Path> const &p, Crossings const &crs) {
32
    std::vector<Point> locs;
33
    CrossingGraph ret;
34
    for(unsigned i = 0; i < crs.size(); i++) {
35
        Point pnt = p[crs[i].a].pointAt(crs[i].ta);
36
        unsigned j = 0;
37
        for(; j < locs.size(); j++) {
38
            if(are_near(pnt, locs[j])) break;
39
        }
40
        if(j == locs.size()) {
41
            ret.push_back(CrossingNode());
42
            locs.push_back(pnt);
43
        }
44
        ret[j].add_edge(Edge(crs[i].a, crs[i].ta, false));
45
        ret[j].add_edge(Edge(crs[i].a, crs[i].ta, true));
46
        ret[j].add_edge(Edge(crs[i].b, crs[i].tb, false));
47
        ret[j].add_edge(Edge(crs[i].b, crs[i].tb, true));
48
    }
49
    
50
    for(unsigned i = 0; i < ret.size(); i++) {
51
        for(unsigned j = 0; j < ret[i].edges.size(); j++) {
52
            unsigned pth = ret[i].edges[j].path;
53
            double t = ret[i].edges[j].time;
54
            bool rev = ret[i].edges[j].reverse;
55
            double size = p[pth].size()+1;
56
            double best = size;
57
            unsigned bix = ret.size();
58
            for(unsigned k = 0; k < ret.size(); k++) {
59
                for(unsigned l = 0; l < ret[k].edges.size(); l++) {
60
            	    if(ret[i].edges[j].path == ret[k].edges[l].path && (k != i || l != j)) {
61
                        double d = wrap_dist(t, ret[i].edges[j].time, size, rev);
62
                        if(d < best) {
63
                            best = d;
64
                            bix = k;
65
                        }
66
                    }
67
                }
68
            }
69
            if(bix == ret.size()) {
70
                std::cout << "couldn't find an adequate next-crossing node";
71
                bix = i;
72
            }
73
            ret[i].edges[j].node = bix;
74
        }
75
    }
76
    
77
    return ret;
78
 */
79
 /*  Various incoherent code bits   
80
    // list of sets of edges, each set corresponding to those emanating from the path
81
    CrossingGraph ret;
82
    std::vector<Edge> edges(crs.size());
83
    
84
    std::vector<std::vector<bool> > used;
85
    unsigned i, j;
86
    do {
87
        first_false(used, i, j);
88
        CrossingNode cn;
89
        do {
90
            unsigned di = i, dj = j;
91
            crossing_dual(di, dj);
92
            if(!used[di,dj]) {
93
                
94
            }
95
        }
96
        
97
    } while(!used[i,j])
98
    
99
    
100
    for(unsigned j = 0; j < crs[i].size(); j++) {
101
        
102
        edges.push_back(Edge(i, crs[i][j].getOtherTime(i), false));
103
        edges.push_back(Edge(i, crs[i][j].getOtherTime(i), true));
104
    }
105
    std::sort(edges.begin(), edges.end(), TimeOrder());
106
    for(unsigned j = 0; j < edges.size(); ) {
107
        CrossingNode cn;
108
        double t = edges[j].time;
109
        while(j < edges.size() && are_near(edges[j].time, t)) {
110
            cn.edges.push_back(edges[j]);
111
        }
112
    }
113
*/
114
//}
115
116
void merge_crossings(Crossings &a, Crossings &b, unsigned i) {
117
    Crossings n;
118
    sort_crossings(b, i);
119
    n.resize(a.size() + b.size());
120
    std::merge(a.begin(), a.end(), b.begin(), b.end(), n.begin(), CrossingOrder(i));
121
    a = n;
122
}
123
124
void offset_crossings(Crossings &cr, double a, double b) {
125
    for(unsigned i = 0; i < cr.size(); i++) {
126
        cr[i].ta += a;
127
        cr[i].tb += b;
128
    }
129
}
130
131
Crossings reverse_ta(Crossings const &cr, std::vector<double> max) {
132
    Crossings ret;
133
    for(Crossings::const_iterator i = cr.begin(); i != cr.end(); ++i) {
134
        double mx = max[i->a];
135
        ret.push_back(Crossing(i->ta > mx+0.01 ? (1 - (i->ta - mx) + mx) : mx - i->ta,
136
                               i->tb, !i->dir));
137
    }
138
    return ret;
139
}
140
141
Crossings reverse_tb(Crossings const &cr, unsigned split, std::vector<double> max) {
142
    Crossings ret;
143
    for(Crossings::const_iterator i = cr.begin(); i != cr.end(); ++i) {
144
        double mx = max[i->b - split];
145
        std::cout << i->b << "\n";
146
        ret.push_back(Crossing(i->ta, i->tb > mx+0.01 ? (1 - (i->tb - mx) + mx) : mx - i->tb,
147
                               !i->dir));
148
    }
149
    return ret;
150
}
151
152
CrossingSet reverse_ta(CrossingSet const &cr, unsigned split, std::vector<double> max) {
153
    CrossingSet ret;
154
    for(unsigned i = 0; i < cr.size(); i++) {
155
        Crossings res = reverse_ta(cr[i], max);
156
        if(i < split) std::reverse(res.begin(), res.end());
157
        ret.push_back(res);
158
    }
159
    return ret;
160
}
161
162
CrossingSet reverse_tb(CrossingSet const &cr, unsigned split, std::vector<double> max) {
163
    CrossingSet ret;
164
    for(unsigned i = 0; i < cr.size(); i++) {
165
        Crossings res = reverse_tb(cr[i], split, max);
166
        if(i >= split) std::reverse(res.begin(), res.end());
167
        ret.push_back(res);
168
    }
169
    return ret;
170
}
171
172
void clean(Crossings &/*cr_a*/, Crossings &/*cr_b*/) {
173
/*    if(cr_a.empty()) return;
174
    
175
    //Remove anything with dupes
176
    
177
    for(Eraser<Crossings> i(&cr_a); !i.ended(); i++) {
178
        const Crossing cur = *i;
179
        Eraser<Crossings> next(i);
180
        next++;
181
        if(are_near(cur, *next)) {
182
            cr_b.erase(std::find(cr_b.begin(), cr_b.end(), cur));
183
            for(i = next; near(*i, cur); i++) {
184
                cr_b.erase(std::find(cr_b.begin(), cr_b.end(), *i));
185
            }
186
            continue;
187
        }
188
    }
189
*/
190
}
191
192
}
193
194
/*
195
  Local Variables:
196
  mode:c++
197
  c-file-style:"stroustrup"
198
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
199
  indent-tabs-mode:nil
200
  fill-column:99
201
  End:
202
*/
203
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :