如何使用 QwtSpline 创建 B 样条曲线

How to create a B-Spline with QwtSpline

在 QwtSpline 中有两种不同类型的样条,但我看不出这两种类型之间有什么区别。

我找到了一张图片,它解释了我的问题:

QwtSpline 总是创建一条样条曲线,就像图片左侧的那样。 但是我想要一个样条曲线,就像右边那个一样。

我的代码如下:

QwtSpline spline;
QPolygonF polygon;
QVector<QPointF> result;

polygon.append(startPoint);
polygon.append(rotatedPoint);
polygon.append(endPoint);

spline.setPoints(polygon);

for(double i = startPoint.rx(); i < endPoint.rx(); i++)
{
    result << QPointF(i, spline.value(i));
}
result << QPointF(endPoint.rx(), spline.value(endPoint.rx()));

我想做的,就是在QwtPlot上画一条像图片右边那样的样条线。也许有一种更简单的方法来解决我的问题,而不是创建一个 QwtSpline 迭代它以创建一个 QwtSpline 上的每个点的 QwtCurve。

如果画贝塞尔曲线到QwtPlot更简单,那没问题,贝塞尔曲线对我来说更容易。我只取了样条,因为我在Qwt中没有找到bezier曲线

从 >= 6.2 的分支之一尝试 Qwt。它有几个样条插值算法的全新实现。

但如果只是绘制贝塞尔曲线,你也可以使用QwtShapeItem,什么是显示QPainterPath。当然,您也可以使用 QPainterPath 从贝塞尔曲线创建 QPolygon,然后使用 QwtPlotCurve。

好的伙计们,因为您之前不喜欢我的回答,我将尝试解释如何计算贝塞尔曲线:

我认为最简单的方法是使用 Bernstein-Bézier 曲线表示。

为此,您必须找出伯恩斯坦多项式。那并不难。有一个公式可以做到这一点

n 是曲线的点数,并且 我才是重点。

也就是说你有这么多的伯恩斯坦多项式,你有多少个点。

如果您知道每个 Bernstein 多项式,您就可以使用以下公式计算曲线。

n是总点数和 i 是当前点的索引。

P是一个点,t总是从0到1。0是左边的位置,1代表右边的位置。 r 是曲线的新点。

现在你有两个计算上面的 x 和 y 的公式。

这是 x 的公式

这是 y 的公式

正如您所见,右侧唯一的可变参数是t。这意味着,你必须多次计算这个公式,其中 t 在 0 和 1 之间。最简单的方法是编写一个这样的 for 循环:

QList<QPointF> results = QList<QPointF>();
QList<QPointF> points = QList<QPointF>();
for(double i = 0; i <= 1; i+=0.01)
{
    double x = //formular for rx
    double y = //formular for ry
    results << QPointF(x, y);
}

希望不要太复杂。如果你不明白这个简短的解释,你可以看看数学手册。在第六版中,它的现场 1000 到 1001。

国际标准书号:978-3-662-46220-1