如何使用 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
在 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