【发布时间】:2020-04-03 09:26:14
【问题描述】:
我正在为桑基图创建带有贝塞尔曲线的点之间的链接。
这是我尝试过的代码:
let
margin = 10,
x0 = 20,
y0 = 20,
x1 = 150,
y1 = 100,
width = 30,
path = d3.path(),
path2 = d3.path(),
controlPointX = (x0 + x1) / 2;
/* with filled path */
path.moveTo(x0, y0);
path.bezierCurveTo(controlPointX, y0, controlPointX, y1, x1, y1);
path.lineTo(x1, y1 + width);
path.bezierCurveTo(controlPointX, y1 + width, controlPointX, y0 + width, x0, y0 + width);
path.closePath();
let svg = d3.select('svg');
let g = svg.append('g').attr('transform', `translate(${margin}, ${margin})`);
g.append('path')
.attr('d', path)
.attr('fill', 'red');
// curve 2 offset
y0 += 120;
y1 += 120;
// with stroke
path2.moveTo(x0, y0);
path2.bezierCurveTo(controlPointX, y0, controlPointX, y1, x1, y1);
g.append('path')
.attr('d', path2)
.attr('stroke-width', width)
.attr('stroke', 'blue')
.attr('fill', 'none');
在第一种方法中,两条曲线之间的垂直宽度不相同。但在第二个例子中,我使用了相同的单曲线和中风作为高度,效果很好。我想通过填充路径实现相同的目标。
【问题讨论】:
-
这能回答你的问题吗? How to offset a cubic bezier curve?
标签: javascript d3.js math svg