抛物线拟合算法

本文深入探讨了CParabolaBlendCurve类的功能与实现细节,该类主要用于通过贝塞尔曲线算法创建平滑的曲线。文章详细解析了类中的关键函数,包括如何将一组点转换为连续平滑曲线的parabolaBlendCurve函数,以及用于计算曲线中特定点坐标的createParabolaCurve函数。此外,还介绍了如何利用Qt数学库进行复杂的数学运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CParabolaBlendCurve.h
#ifndef CPARABOLABLENDCURVE_H
#define CPARABOLABLENDCURVE_H

#include <QVector>
#include <QPointF>

class CParabolaBlendCurve
{
public:
    CParabolaBlendCurve();

    QVector<QPointF> parabolaBlendCurve(QVector<QPointF>);
    QPointF parabolaBlendCurve(qreal t, QPointF p0, QPointF p1, QPointF p2, QPointF p3);
    QVector<QPointF> createParabolaCurve(QPointF p0, QPointF p1, QPointF p2, QPointF p3);
};

#endif // CPARABOLABLENDCURVE_H

CParabolaBlendCurve.cpp

#include "cparabolablendcurve.h"
#include <QtMath>

CParabolaBlendCurve::CParabolaBlendCurve()
{
}

QVector<QPointF> CParabolaBlendCurve::parabolaBlendCurve(QVector<QPointF> points)
{
    if (points.size() < 4)
    {
        return points;
    }

    QVector<QPointF> curvePoints;

    // first curve
    QPointF virtualHeaderPoint = points.at(1);
    QVector<QPointF> pointVector = createParabolaCurve(virtualHeaderPoint,points.at(0),points.at(1),points.at(2));
    curvePoints += pointVector;

    // mixed curve
    for (int i=0; i<=points.size() - 4; i++)
    {
        QVector<QPointF> pointVector = createParabolaCurve(points.at(i), points.at(i+1), points.at(i+2), points.at(i+3));
        curvePoints += pointVector;
    }

    // last curve
    QPointF virtualTailPoint = points.at(points.size() - 2);
    pointVector = createParabolaCurve(points.at(points.size()-3), points.at(points.size()-2),points.at(points.size()-1),virtualTailPoint);
    curvePoints += pointVector;

    return curvePoints;
}

QPointF CParabolaBlendCurve::parabolaBlendCurve(qreal t, QPointF p0, QPointF p1, QPointF p2, QPointF p3)
{
    qreal x = (4 * qPow(t, 2) - t - 4 * qPow(t, 3)) * p0.x() +
              (1 - 10 * qPow(t, 2) + 12 * qPow(t, 3)) * p1.x() +
              (t + 8 * qPow(t, 2) - 12 * qPow(t, 3)) * p2.x() +
              (4 * qPow(t, 3) -  2 * qPow(t, 2)) * p3.x();

    qreal y = (4 * qPow(t, 2) - t - 4 * qPow(t, 3)) * p0.y() +
              (1 - 10 * qPow(t, 2) + 12 * qPow(t, 3)) * p1.y() +
              (t + 8 * qPow(t, 2) - 12 * qPow(t, 3)) * p2.y() +
              (4 * qPow(t, 3) -  2 * qPow(t, 2)) * p3.y();

    return QPointF(x, y);
}

QVector<QPointF> CParabolaBlendCurve::createParabolaCurve(QPointF p0, QPointF p1, QPointF p2, QPointF p3)
{
    QVector<QPointF> lineVector;
    int pointCount = 100;
    qreal maxT = 0.5;
    qreal step = maxT / pointCount;
    qreal t = 0;
    for (int i = 0; i<pointCount; i++)
    {
        QPointF point = parabolaBlendCurve(t, p0, p1, p2, p3);
        if (!point.isNull())
        {
            lineVector.append(point);
        }
        t += step;
    }

    return lineVector;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值