如何使用QwtSpline创建B样条

时间:2018-08-24 12:31:46

标签: c++ qt qwt bspline

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

我找到一张图片,解释了我的问题: "https://i.stack.imgur.com/x3cVJ.jpg"

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遍历QwtSpline上的每个点创建QwtCurve更为简单的方法来解决我的问题。

如果比较容易,可以在QwtPlot上绘制贝塞尔曲线,这没问题,贝塞尔曲线对我来说会更容易。我只花了一条样条线,因为我没有在Qwt中找到贝塞尔曲线。

2 个答案:

答案 0 :(得分:0)

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

但是,如果仅是要绘制贝塞尔曲线,则也可以使用QwtShapeItem,它显示QPainterPath。当然,您也可以使用QPainterPath从贝塞尔曲线创建QPolygon,然后使用QwtPlotCurve。

答案 1 :(得分:0)

好吧,因为您不喜欢我的答案,所以我将尝试解释如何计算贝塞尔曲线:

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

为此,您必须找出伯恩斯坦多项式。那不难。有一个制定者可以这样做enter image description here

n是曲线的点数, 我才是真正的重点。

这意味着您有那么多伯恩斯坦多项式,有多少点。

如果您知道每个伯恩斯坦多项式,则可以使用以下公式来计算曲线。 enter image description here

n是总点数, 我是当前点的索引。

P是一个点,并且t始终从0到1。0是左侧的位置,1表示右侧的位置。 r是曲线的新点。

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

这是x的公式

enter image description here

这是y的公式

enter image description here

如您所见,右侧唯一的变量参数是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。

ISBN:978-3-662-46220-1