我正在开发图形编辑器应用程序。它具有Bezier工具。我想实现它类似于Paint.NET应用程序中的bezier控件,在该应用程序中,曲线的两个句柄(除了端点)放置在曲线本身上,用户可以通过它来控制曲率。如图所示,将这些手柄放置在曲线上可以使图形绘制者感觉更好,
但是我的问题是.NET中的DrawBezier方法获得了两个控制点,这些控制点不能保证始终放置在曲线上。 您知道如何使用这两个曲线上手柄的坐标绘制Bezier吗?
答案 0 :(得分:1)
我们可以使用标准多项式曲线拟合通过任何四个点集找到一条三次贝塞尔曲线,但是您总是会遇到一个自由参数问题:两个点将成为起点,曲线的末端,所以我们知道它们的时间值为0和1,但是这两点在时间值方面是完全自由的,因此您将不得不合理地假设它们之前应该是什么您可以评估曲线拟合。
如果您想自己实现数学,请参见https://pomax.github.io/bezierinfo/#curvefitting进行数学运算,或者找到一个可以进行多项式拟合的库(这意味着任何半体面的统计数据包),然后对于计时值可以有以下几种选择:
显然,其中2个将以最少的工作量提供“合理的”结果,但是,如果您正在编写图形应用程序,则“合理的”取决于用户的需求,而不取决于您的需求。
答案 1 :(得分:0)
Graphics类的 DrawCurve 方法可以完成这项工作。也就是说,应该使用Canonical Spline,而不是使用Bezier曲线。
我在 Charles Petzold 的书(使用C#编程Windows)中找到了它:
“规范样条线-图形类包括第二种样条线,称为规范样条线,表示标准样条线或普通样条线...”