]> granicus.if.org Git - graphviz/commitdiff
arrows: arrow_type_box: fix positioning of box arrow
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 4 Oct 2022 11:40:09 +0000 (13:40 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Fri, 14 Oct 2022 13:59:16 +0000 (15:59 +0200)
Towards https://gitlab.com/graphviz/graphviz/-/issues/372.

lib/common/arrows.c

index 00cc94d42662cdabac998e66461f4875f7d12322..0047235bdef5059518338b4600296fdc2934cd93 100644 (file)
@@ -701,6 +701,21 @@ static pointf arrow_type_box(GVJ_t * job, pointf p, pointf u, double arrowsize,
     m.y = p.y + u.y * 0.8;
     q.x = p.x + u.x;
     q.y = p.y + u.y;
+
+    const pointf P = {-u.x, -u.y};
+    // phi = angle of arrow
+    const double cosPhi = P.x / hypot(P.x, P.y);
+    const double sinPhi = P.y / hypot(P.x, P.y);
+    const pointf delta = {penwidth / 2.0 * cosPhi, penwidth / 2.0 * sinPhi};
+
+    // move the arrow backwards to not visually overlap the node
+    p.x -= delta.x;
+    p.y -= delta.y;
+    m.x -= delta.x;
+    m.y -= delta.y;
+    q.x -= delta.x;
+    q.y -= delta.y;
+
     a[0].x = p.x + v.x;
     a[0].y = p.y + v.y;
     a[1].x = p.x - v.x;
@@ -721,6 +736,9 @@ static pointf arrow_type_box(GVJ_t * job, pointf p, pointf u, double arrowsize,
     a[1] = q;
     gvrender_polyline(job, a, 2);
 
+    // A polyline doesn't extend visually beyond its starting point, so we
+    // return the starting point as it is, without taking penwidth into account
+
     return q;
 }