]> granicus.if.org Git - graphviz/commitdiff
Add utility function to return approximate midpoint of an edge
authorerg <devnull@localhost>
Tue, 24 May 2011 20:17:01 +0000 (20:17 +0000)
committererg <devnull@localhost>
Tue, 24 May 2011 20:17:01 +0000 (20:17 +0000)
lib/common/render.h
lib/common/splines.c

index 1283739c053e8f678f836eb42c77aa6122f55b74..bea9f5468f5471515ff0bae3e544659253f85a84 100644 (file)
@@ -134,6 +134,7 @@ extern "C" {
     extern void place_graph_label(Agraph_t *);
     extern void place_portlabel(edge_t * e, boolean head_p);
     extern void makePortLabels(edge_t * e);
+    extern pointf edgeMidpoint(graph_t* g, edge_t * e);
     extern void addEdgeLabels(graph_t* g, edge_t * e, pointf rp, pointf rq);
     extern void pop_obj_state(GVJ_t *job);
     extern obj_state_t* push_obj_state(GVJ_t *job);
index 13d3485fc80f69975952e7f5fb45536a0e0b5e4b..ada1efeab972c50153de4755c711334f4f5c736c 100644 (file)
@@ -1195,6 +1195,28 @@ polylineMidpoint (splines* spl, pointf* pp, pointf* pq)
     return mf;
 }
 
+pointf
+edgeMidpoint (graph_t* g, edge_t * e)
+{
+    int et = EDGE_TYPE (g);
+    pointf d, spf, p, q;
+
+    endPoints(ED_spl(e), &p, &q);
+    if (APPROXEQPT(p, q, MILLIPOINT)) { /* degenerate spline */
+       spf = p;
+    }
+    else if (et == ET_SPLINE) {
+       d.x = (q.x + p.x) / 2.;
+       d.y = (p.y + q.y) / 2.;
+       spf = dotneato_closest(ED_spl(e), d);
+    }
+    else {   /* ET_PLINE, ET_ORTHO or ET_LINE */
+       spf = polylineMidpoint (ED_spl(e), &p, &q);
+    }
+
+    return spf;
+}
+
 #define LEFTOF(a,b,c) (((a.y - b.y)*(c.x - b.x) - (c.y - b.y)*(a.x - b.x)) > 0)
 #define MAXLABELWD  (POINTS_PER_INCH/2.0)