diff options
author | David Robillard <d@drobilla.net> | 2013-12-18 19:59:01 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2013-12-18 19:59:01 +0000 |
commit | 1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba (patch) | |
tree | 6a4b38efa2052e08365c0dc3ed8a5e9ba7354d2f /src | |
parent | 63c2c34dd2b4ae5be99284b94c0b99d39600bd6f (diff) | |
download | ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.gz ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.tar.bz2 ganv-1dffad8f3b0d7919357bc3a10ccfd3f66b3c38ba.zip |
Shorter code.
git-svn-id: http://svn.drobilla.net/lad/trunk/ganv@5182 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r-- | src/Canvas.cpp | 42 | ||||
-rw-r--r-- | src/fdgl.hpp | 14 |
2 files changed, 25 insertions, 31 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp index a0d956f..58f1e9e 100644 --- a/src/Canvas.cpp +++ b/src/Canvas.cpp @@ -708,18 +708,20 @@ GanvCanvasImpl::layout_dot(const std::string& filename) #ifdef GANV_FDGL -static void -get_pos_area(const GanvNode* node, Vector* pos, Vector* area) +inline Region +get_region(const GanvNode* node) { double x1, y1, x2, y2; ganv_item_get_bounds(GANV_ITEM(node), &x1, &y1, &x2, &y2); - area->x = x2 - x1; - area->y = y2 - y1; - pos->x = x1 + (area->x / 2.0); - pos->y = y1 + (area->y / 2.0); + Region reg; + reg.area.x = x2 - x1; + reg.area.y = y2 - y1; + reg.pos.x = x1 + (reg.area.x / 2.0); + reg.pos.y = y1 + (reg.area.y / 2.0); - ganv_item_i2w(GANV_ITEM(node), &pos->x, &pos->y); + ganv_item_i2w(GANV_ITEM(node), ®.pos.x, ®.pos.y); + return reg; } inline void @@ -737,36 +739,24 @@ GanvCanvasImpl::layout_iteration() if (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i)) { continue; } - GanvNode* const node = GANV_NODE(*i); - Vector pos; - Vector area; - get_pos_area(node, &pos, &area); + const Region reg = get_region(node); FOREACH_ITEM(_items, j) { - if (i == j || !GANV_IS_NODE(*j)) { + if (i == j || (!GANV_IS_MODULE(*i) && !GANV_IS_CIRCLE(*i))) { continue; } - GanvNode* const node2 = GANV_NODE(*j); - Vector pos2; - Vector area2; - get_pos_area(node2, &pos2, &area2); - - const Vector f = repel_force(pos, area, pos2, area2); - - apply_force(node, node2, f); + const Region reg2 = get_region(node2); + apply_force(node, node2, repel_force(reg, reg2)); } // Add fake long spring to partner to line up as if connected GanvNode* partner = ganv_node_get_partner(node); if (partner) { - Vector ppos; - Vector parea; - get_pos_area(partner, &ppos, &parea); - - const Vector f = spring_force(ppos, pos, parea.x); - apply_force(node, partner, f); + const Region preg = get_region(partner); + apply_force(node, partner, + spring_force(preg.pos, reg.pos, preg.area.x)); } } diff --git a/src/fdgl.hpp b/src/fdgl.hpp index 844912e..c2dac10 100644 --- a/src/fdgl.hpp +++ b/src/fdgl.hpp @@ -20,6 +20,11 @@ static const double SPRING_K = 12.0; static const double CHARGE_KE = 80000.0; static const double AREA_WEIGHT = 0.4; +struct Region { + Vector pos; + Vector area; +}; + inline Vector vec_add(const Vector& a, const Vector& b) { @@ -66,13 +71,12 @@ spring_force(const Vector& a, const Vector& b, const double length) /** Modified Coulomb's law */ inline Vector -repel_force(const Vector& a, const Vector& a_area, - const Vector& b, const Vector& b_area) +repel_force(const Region& a, const Region& b) { - const Vector vec = vec_mult(vec_sub(a, b), 4.0); + const Vector vec = vec_mult(vec_sub(a.pos, b.pos), 4.0); const double rmag = vec_rmag(vec); - const Vector a_weight = vec_mult(a_area, AREA_WEIGHT); - const Vector b_weight = vec_mult(b_area, AREA_WEIGHT); + const Vector a_weight = vec_mult(a.area, AREA_WEIGHT); + const Vector b_weight = vec_mult(b.area, AREA_WEIGHT); const Vector force = vec_mult(vec, rmag * rmag * rmag * CHARGE_KE * 0.5); return vec_mult(force, vec_mult(a_weight, b_weight)); } |