JSFiddle - React, Tailwind, and code Playground
CSS
svg {
border: 1px solid red;
}
path {
stroke: black;
stroke-width: 2px;
fill: steelblue;
}
JavaScript
var panel = d3.select('body');
svg = panel.append('svg')
.attr('width', 500)
.attr('height', 500);
var arrow_path = function(x1, y1, x2, y2, width, r, directed, gizmo) {
var dx = x2 - x1; // direction of arrow
var dy = y2 - y1;
var l = Math.sqrt(dx * dx + dy * dy); // length of arrow
var fx = dx / l; // forward vector
var fy = dy / l;
var lx = -fy; // side vector
var ly = fx;
var line_rectangle = [
(x1 + lx*width) + ',' + (y1 + ly*width),
(x2 + lx*width) + ',' + (y2 + ly*width),
(x2 - lx*width) + ',' + (y2 - ly*width),
(x1 - lx*width) + ',' + (y1 - ly*width)
];
var alx, aly, arx, ary;
if (directed) {
alx = x2 - fx*r*2 + lx*r;
aly = y2 - fy*r*2 + ly*r;
arx = x2 - fx*r*2 - lx*r;
ary = y2 - fy*r*2 - ly*r;
};
var get_end_points = function () {
// return list of end vertexes that for an arrow or just side of rectangle.
if(directed) {
return [
'L' + (x2 - fx*r*2 + lx * width) + ',' + (y2 - fy*r*2 + ly * width),
'L' + (x2 - fx*r*2 + lx * r) + ',' + (y2 - fy*r*2 + ly * r),
'L' + x2 + ',' + y2,
'L' + (x2 - fx*r*2 - lx * r) + ',' + (y2 - fy*r*2 - ly * r),
'L' + (x2 - fx*r*2 - lx * width) + ',' + (y2 - fy*r*2 - ly * width),
];
} else {
return [
'L' + line_rectangle[1],
'L' + line_rectangle[2],
];
};
};
if (!gizmo) {
return [
'M' + x1 + ',' + y1,
'L' + line_rectangle[0]
].concat(
get_end_points(),
[
'L' + line_rectangle[3],
'L' + x1 + ',' + y1,
]
).join(' ');
};
var cx = (x1 + x2) / 2;
var cy = (y1 + y2) / 2;
var h = Math.sqrt(r*r - width*width);
var arc_rectangle = [
(cx...