我编写了一个图表编辑器,并绘制了一些曲线链接,这些链接可以完美地用于二次贝塞尔曲线段(参见图片):

我寻找最好的方法(如果可能)绘制“尖峰”弯曲的链接。大约像这样(蓝色):

我不知道从哪里开始,我读了几篇有关画笔的文章或“如何绘制弯曲的文本”,但这似乎不是我所需要的。

感谢您的帮助或建议! :)

仅需完成几句话,贝塞尔曲线就由3分的quadrametricBezier类制成。感谢大家 !

最佳答案

我认为WPF中没有内置方法可以做到这一点。您必须自己计算坐标并自己绘制线条(例如,使用DrawingVisual)。

要计算坐标,您必须:

步骤1沿贝塞尔曲线采样点。

具有4个控制点的贝塞尔曲线具有以下公式:

curve(t) = t^3 p1 + 3 t^2 (1-t) p2 + 3 t (1-t)^2 p3 + (1-t)^3 p4

d/dt curve(t) = 3 p3 - 3 p4 + 6 p2 t - 12 p3 t + 6 p4 t + 3 p1 t^2 - 9 p2 t^2 + 9 p3 t^2 - 3 p4 t^2

使用这些公式,您可以计算曲线上的点及其切线方向。将切线方向旋转90°(即交换X / Y并更改Y的符号)可得出法线方向。

但是,这些点不是等距的:

因此,如果直接使用这些点,则会得到一条曲线,其中一些“尖峰”比其他一些短:

步骤2:沿曲线获取等距点

现在,您将获得一条沿曲线的点列表。您可以计算每个点与下一个点之间的欧式距离。将所有这些距离相加得出曲线的总长度。

假设您要使用(大约)10像素宽的峰值。然后,您需要n=round(TotalLength / 10)点。这些点位于s(i) = TotalLength / n * i

所以如果你想找到第三个等距点的t的值,即可计算s(3) = TotalLength / n * 3。然后,您将遍历一组采样点,并随距离累加距离,直到达到沿曲线的总距离> s(3)的点。现在,您知道了要查找的点之前和之后的点,并且可以使用3的规则来计算之间的t。

现在,您有一组沿曲线相距相同距离的点:

步骤3:绘制峰值

这是最简单的部分:在每个等距点,计算法线(使用上面的导数公式)。将法线除以其长度即可得到单位法线。然后将每个偶数点+d * UnitNormal和每个奇数点-d * UnitNormal相加,其中d是尖峰的“深度”,即笔尖到曲线的距离。

10-07 17:02