如何在不知道控制点但曲线上有四个点的情况下绘制贝塞尔曲线?

时间:2018-12-28 12:37:18

标签: .net graphics bezier

我正在开发图形编辑器应用程序。它具有Bezier工具。我想实现它类似于Paint.NET应用程序中的bezier控件,在该应用程序中,曲线的两个句柄(除了端点)放置在曲线本身上,用户可以通过它来控制曲率。如图所示,将这些手柄放置在曲线上可以使图形绘制者感觉更好,enter image description here

但是我的问题是.NET中的DrawBezier方法获得了两个控制点,这些控制点不能保证始终放置在曲线上。 您知道如何使用这两个曲线上手柄的坐标绘制Bezier吗?

2 个答案:

答案 0 :(得分:1)

我们可以使用标准多项式曲线拟合通过任何四个点集找到一条三次贝塞尔曲线,但是您总是会遇到一个自由参数问题:两个点将成为起点,曲线的末端,所以我们知道它们的时间值为0和1,但是这两点在时间值方面是完全自由的,因此您将不得不合理地假设它们之前应该是什么您可以评估曲线拟合。

如果您想自己实现数学,请参见https://pomax.github.io/bezierinfo/#curvefitting进行数学运算,或者找到一个可以进行多项式拟合的库(这意味着任何半体面的统计数据包),然后对于计时值可以有以下几种选择:

  • 假设点与t = 0,t = 1/3,t = 2/3和t = 1对齐。这几乎总是一个坏主意,因为点很少相对于三次分布均匀分布。
  • 根据线性距离猜测t值,将折线p0-p1-p2-p3的全长设置为1,并且每个点的值都等于沿折线的距离,因此t0 = 0, t1 = dist(p0,p1),t2 = dist(p0,p1)+ dist(p1,2),t3 = 1。
  • 获得更高的评价并选择一组初始的t值,然后分析所得的Bezier并迭代生成新曲线,优化某些质量,例如曲率均匀性,边界框/船体区域,在最小半径上对齐p1 / p2等。 / li>

显然,其中2个将以最少的工作量提供“合理的”结果,但是,如果您正在编写图形应用程序,则“合理的”取决于用户的需求,而不取决于您的需求。

答案 1 :(得分:0)

Graphics类的 DrawCurve 方法可以完成这项工作。也就是说,应该使用Canonical Spline,而不是使用Bezier曲线。

我在 Charles Petzold 的书(使用C#编程Windows)中找到了它:

“规范样条线-图形类包括第二种样条线,称为规范样条线,表示标准样条线或普通样条线...”