QCustomPlot之参数曲线(七)

文章目录

QCPCurve用于绘制参数方程曲线,常见的参数方程有以下几种:

常见参数方程曲线

QCPCurveQCPGraph的区别在于它引入了第三个坐标t,而QCPGraph只有x,y两个坐标,这是因为在参数方程曲线中,可能会有多个点对应同个key坐标,而t坐标的引入决定了参数方程x,y坐标的顺序,这样就不会混乱

在数据方面,t坐标在QCPCurve表现为排序键sortKeyx坐标表现为主键mainKeyy坐标表现为mainValue,而在QCPGraph中排序键sortKey和主键mainKey都是x坐标,y坐标表现为mainValue

参数方程的使用
void MainWindow::setupLemniscateDemo(QCustomPlot *customPlot)
{
    QCPCurve *curve = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
    curve->setPen(QPen(Qt::red));

    // 由于我们是动态图,并且其范围不变化,所以预先设置好了范围
    customPlot->xAxis->setRange(-2.5, 12.5);
    customPlot->yAxis->setRange(-2.8, 2.8);

    connect(&dataTimer, SIGNAL(timeout()), this, SLOT(dynamicLemniscateSlot()));
    dataTimer.start(10);      // 10ms刷新一次,实际上QTimer可能达不到这个精度
}

参数方程来自:伯努利双纽线(无穷大的符号)

void MainWindow::dynamicLemniscateSlot()
{
    static double t = -M_PI;           // 定义起始t
    static bool reversed = false;   // 为了重复绘制

    QCPCurve *curve = static_cast<QCPCurve *>(ui->customPlot->plottable(0));

    //  伯努利双纽线(无穷大的符号)
    double x = -686*qCos(t) + 735*qCos(2*t) + 490*qSqrt(qPow(qSin(t), 4)) - 265;
    x /= (280*qCos(t) - 298);
    double y = 5*qSqrt(qPow(qSin(t), 4))*(10/qSin(t) - 7/qTan(t)) + 3*(35*qCos(t) - 33)*qSin(t);
    y = 7*y/(140*qCos(t) - 149);

    if (!reversed) {        // 还未绘制完成
        t += 0.01;
        curve->data()->add(QCPCurveData(t, x, y));
    } else {               // 绘制已经完成,倒退回去
        t -= 0.01;
        curve->data()->removeAfter(t);        // 这里不能用remove,因为精度原因,remove并不能精确匹配,导致无法删除数据点
    }

    ui->customPlot->replot();

    // 重复绘制
    if (t >= M_PI) {
        t = M_PI;
        reversed = true;
    } else if (reversed && t <= -M_PI) {
        t = -M_PI;
        reversed = false;
    }
}

效果图

QCustomPlot中,要画封闭曲线,可以使用QCPCurve类。首先,你需要创建一个QCPCurve对象,并将其添加到QCustomPlot中的一个图层中。然后,使用QCPCurve的setData方法设置曲线的数据点。最后,调用QCPCurve的setClosed方法将曲线设置为封闭的。以下是一个示例代码: ```cpp // 创建一个QCPCurve对象 QCPCurve *curve = new QCPCurve(customPlot->xAxis, customPlot->yAxis); // 将曲线添加到图层中 customPlot->addPlottable(curve); // 设置曲线的数据点 QVector<QCPCurveData> data; // 添加数据点到data中 // ... // 设置曲线的数据 curve->setData(data); // 将曲线设置为封闭的 curve->setClosed(true); // 更新图表 customPlot->replot(); ``` 请注意,你需要根据你的具体需求修改代码中的数据点和其他参数。 #### 引用[.reference_title] - *1* [QCustomPlot之平滑曲线下(九)](https://blog.csdn.net/qq10097355/article/details/104890734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [QTQCustomPlot绘制曲线图](https://blog.csdn.net/qq_39154864/article/details/124477945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [QT绘图用QCustomPlot库,简单画一个曲线图,涉及了QCustomPlot的最基础知识(画图必用到的属性)](https://blog.csdn.net/m0_49456900/article/details/125071836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值