在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遍历QwtSpline上的每个点创建QwtCurve更为简单的方法来解决我的问题。
如果比较容易,可以在QwtPlot上绘制贝塞尔曲线,这没问题,贝塞尔曲线对我来说会更容易。我只花了一条样条线,因为我没有在Qwt中找到贝塞尔曲线。
答案 0 :(得分:0)
尝试从分支之一中的Qwt> = 6.2。它具有多种样条插值算法的全新实现。
但是,如果仅是要绘制贝塞尔曲线,则也可以使用QwtShapeItem,它显示QPainterPath。当然,您也可以使用QPainterPath从贝塞尔曲线创建QPolygon,然后使用QwtPlotCurve。
答案 1 :(得分:0)
好吧,因为您不喜欢我的答案,所以我将尝试解释如何计算贝塞尔曲线:
我认为最简单的方法是使用曲线的Bernstein-Bézier表示。
为此,您必须找出伯恩斯坦多项式。那不难。有一个制定者可以这样做
n是曲线的点数, 我才是真正的重点。
这意味着您有那么多伯恩斯坦多项式,有多少点。
如果您知道每个伯恩斯坦多项式,则可以使用以下公式来计算曲线。
n是总点数, 我是当前点的索引。
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。
ISBN:978-3-662-46220-1