我有一条由D3.js
线生成函数生成的曲线,其中插值设置为“基础”。问题是生成的线只接触到线生成函数中给出的第一个和最后一个点,而不通过中间的点。我知道这些被视为生成b-spline
曲线的控制点,但我正在寻找的是一种“投影”/计算控制点的方法,以便曲线确实通过我的路径数组中的每个点。
我的应用程序中的这些点之间是“句柄”点,用户可以拖动这些点来操纵曲线。如果我将插值设置为“基数”,那么曲线确实会通过每个点,但这不是我想要的曲线类型,我想要“基础”插值产生的更平滑的曲线。
这是我的行生成器代码:
this.lineGenerator = d3.svg.line()
.tension(0.5)
.x(function(d) { return d.x; })
.y(function(d) { return d.y; })
.interpolate("basis");
这是一张说明问题的图片。
换句话说,我拥有的三个点是曲线起点和终点的点以及“顶点”处的点(不知道它叫什么......但曲线的“最高”点) . 所以在图中,红点代表顶点,曲线必须经过这个点。
我发现这个问题处理了同样的问题,但使用的是 HTML 5 Canvas 而不是 D3.js。我尝试应用此处给出的公式来计算曲线的控制点,但最终得到以下结果:
“拖动点”(红点)现在位于曲线下方而不是曲线上,并且随着曲线进一步向外拖动,点与曲线之间的距离也会增加。我推测链接到的问题中的公式不起作用的原因是因为 D3 曲线的公式是 a b-spline
,因此与quadraticCurveTo
该问题中提到的曲线不同。(虽然我可能错了......我所知道的数学是危险的!)
D3
所以我的问题是:有人知道“基础”插值生成曲线的公式吗?任何人都可以帮助推导计算曲线控制点的公式,类似于我在链接到的问题中所做的。