]> granicus.if.org Git - graphviz/commitdiff
arrows: arrow_type_dot: fix positioning of 'dot' shaped edge arrows
authorMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Wed, 5 Oct 2022 14:58:08 +0000 (16:58 +0200)
committerMagnus Jacobsson <Magnus.Jacobsson@berotec.se>
Tue, 18 Oct 2022 18:58:25 +0000 (20:58 +0200)
Towards https://gitlab.com/graphviz/graphviz/-/issues/372.

lib/common/arrows.c

index a0c2414a4e24aae66aa554dd45b892f4298389e3..8602783912deb0e8ef85fd2366ee9d4c5f60ed1d 100644 (file)
@@ -781,13 +781,28 @@ static pointf arrow_type_dot(GVJ_t * job, pointf p, pointf u, double arrowsize,
     pointf AF[2];
 
     r = hypot(u.x, u.y) / 2.;
+
+    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;
+
     AF[0].x = p.x + u.x / 2. - r;
     AF[0].y = p.y + u.y / 2. - r;
     AF[1].x = p.x + u.x / 2. + r;
     AF[1].y = p.y + u.y / 2. + r;
     gvrender_ellipse(job, AF, !(flag & ARR_MOD_OPEN));
 
-    const pointf q = {p.x + u.x, p.y + u.y};
+    pointf q = {p.x + u.x, p.y + u.y};
+
+    // return the visual starting point of the arrow outline
+    q.x -= delta.x;
+    q.y -= delta.y;
 
     return q;
 }