我编写了一个图表编辑器,并绘制了一些曲线链接,这些链接可以完美地用于二次贝塞尔曲线段(参见图片):
我寻找最好的方法(如果可能)绘制“尖峰”弯曲的链接。大约像这样(蓝色):
我不知道从哪里开始,我读了几篇有关画笔的文章或“如何绘制弯曲的文本”,但这似乎不是我所需要的。
感谢您的帮助或建议! :)
仅需完成几句话,贝塞尔曲线就由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
是尖峰的“深度”,即笔尖到曲线的距离。