diff options
| author | Tim Dwyer <tgdwyer@gmail.com> | 2006-07-17 02:25:52 +0000 |
|---|---|---|
| committer | tgdwyer <tgdwyer@users.sourceforge.net> | 2006-07-17 02:25:52 +0000 |
| commit | 6de3190ff1b9655ebce6f915b963ab1a10ad2cfe (patch) | |
| tree | ea20bdd0d815e78ee25c51931a9c8dc519f14bfc /src | |
| parent | more string cleanup (diff) | |
| download | inkscape-6de3190ff1b9655ebce6f915b963ab1a10ad2cfe.tar.gz inkscape-6de3190ff1b9655ebce6f915b963ab1a10ad2cfe.zip | |
Constraints are now properly divided up between the connected components
(bzr r1424)
Diffstat (limited to 'src')
| -rw-r--r-- | src/graphlayout/graphlayout.cpp | 15 | ||||
| -rw-r--r-- | src/libcola/cola.h | 15 | ||||
| -rw-r--r-- | src/libcola/connected_components.cpp | 26 |
3 files changed, 47 insertions, 9 deletions
diff --git a/src/graphlayout/graphlayout.cpp b/src/graphlayout/graphlayout.cpp index 72c47d9bf..ec5c780c7 100644 --- a/src/graphlayout/graphlayout.cpp +++ b/src/graphlayout/graphlayout.cpp @@ -91,7 +91,7 @@ void graphlayout(GSList const *const items) { rs.push_back(new Rectangle(ll[0],ur[0],ll[1],ur[1])); } - SimpleConstraints scy; + SimpleConstraints scx,scy; double ideal_connector_length = prefs_get_double_attribute("tools.connector","length",100); double directed_edge_height_modifier = 1.0; gchar const *directed_str = NULL, *overlaps_str = NULL; @@ -154,7 +154,7 @@ void graphlayout(GSList const *const items) { double eweights[E]; fill(eweights,eweights+E,1); vector<Component*> cs; - connectedComponents(rs,es,cs); + connectedComponents(rs,es,scx,scy,cs); for(unsigned i=0;i<cs.size();i++) { Component* c=cs[i]; printf("Component %d:\n",i); @@ -166,7 +166,7 @@ void graphlayout(GSList const *const items) { cout << endl; ConstrainedMajorizationLayout alg(c->rects,c->edges,eweights,ideal_connector_length); alg.setupConstraints(NULL,NULL,avoid_overlaps, - NULL,NULL,NULL,&scy,NULL,NULL); + NULL,NULL,&c->scx,&c->scy,NULL,NULL); alg.run(); } @@ -183,6 +183,15 @@ void graphlayout(GSList const *const items) { sp_item_move_rel(u, NR::translate(dest - curr)); } } + for(unsigned i=0;i<scx.size();i++) { + delete scx[i]; + } + for(unsigned i=0;i<scy.size();i++) { + delete scy[i]; + } + for(unsigned i=0;i<rs.size();i++) { + delete rs[i]; + } } // vim: set cindent // vim: ts=4 sw=4 et tw=0 wm=0 diff --git a/src/libcola/cola.h b/src/libcola/cola.h index e0cf1257c..d3c1624db 100644 --- a/src/libcola/cola.h +++ b/src/libcola/cola.h @@ -28,11 +28,22 @@ namespace cola { vector<unsigned> node_ids; vector<Rectangle*> rects; vector<Edge> edges; + SimpleConstraints scx, scy; + ~Component() { + for(unsigned i=0;i<scx.size();i++) { + delete scx[i]; + } + for(unsigned i=0;i<scy.size();i++) { + delete scy[i]; + } + } }; // for a graph of n nodes, return connected components void connectedComponents( - vector<Rectangle*> &rs, - vector<Edge> &es, + const vector<Rectangle*> &rs, + const vector<Edge> &es, + const SimpleConstraints &scx, + const SimpleConstraints &scy, vector<Component*> &components); // defines references to three variables for which the goal function diff --git a/src/libcola/connected_components.cpp b/src/libcola/connected_components.cpp index 8450e4874..5eb9d07ab 100644 --- a/src/libcola/connected_components.cpp +++ b/src/libcola/connected_components.cpp @@ -33,8 +33,10 @@ namespace cola { // for a graph of n nodes, return connected components void connectedComponents( - vector<Rectangle*> &rs, - vector<Edge> &es, + const vector<Rectangle*> &rs, + const vector<Edge> &es, + const SimpleConstraints &scx, + const SimpleConstraints &scy, vector<Component*> &components) { unsigned n=rs.size(); vector<Node> vs(n); @@ -45,7 +47,7 @@ namespace cola { vs[i].r=rs[i]; remaining.insert(&vs[i]); } - for(vector<Edge>::iterator e=es.begin();e!=es.end();e++) { + for(vector<Edge>::const_iterator e=es.begin();e!=es.end();e++) { vs[e->first].neighbours.push_back(&vs[e->second]); vs[e->second].neighbours.push_back(&vs[e->first]); } @@ -56,12 +58,28 @@ namespace cola { dfs(v,remaining,component,cmap); components.push_back(component); } - for(vector<Edge>::iterator e=es.begin();e!=es.end();e++) { + for(vector<Edge>::const_iterator e=es.begin();e!=es.end();e++) { pair<Component*,unsigned> u=cmap[e->first], v=cmap[e->second]; assert(u.first==v.first); u.first->edges.push_back(make_pair(u.second,v.second)); } + for(SimpleConstraints::const_iterator ci=scx.begin();ci!=scx.end();ci++) { + SimpleConstraint *c=*ci; + pair<Component*,unsigned> u=cmap[c->left], + v=cmap[c->right]; + assert(u.first==v.first); + u.first->scx.push_back( + new SimpleConstraint(u.second,v.second,c->gap)); + } + for(SimpleConstraints::const_iterator ci=scy.begin();ci!=scy.end();ci++) { + SimpleConstraint *c=*ci; + pair<Component*,unsigned> u=cmap[c->left], + v=cmap[c->right]; + assert(u.first==v.first); + u.first->scy.push_back( + new SimpleConstraint(u.second,v.second,c->gap)); + } } } // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 |
