1

我有一条由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所以我的问题是:有人知道“基础”插值生成曲线的公式吗?任何人都可以帮助推导计算曲线控制点的公式,类似于我在链接到的问题中所做的。

4

0 回答 0