Qt工作总结05 <QPainter 绘制正态分布曲线>

一、使用QPainter(不涉及场景)

1. 步骤

  • 计算数据的均值和标准差:计算数据的均值(μ)和标准差(σ)。

  • 定义正态分布函数:使用正态分布的概率密度函数(PDF)来计算每个点的值。

  • 绘制曲线:使用Qt的绘图功能(如QPainter)来绘制曲线。

2、例子

2. 1. 代码

  • 数据准备:data 是绘制正态分布曲线的数据集。

  • 计算均值和标准差:calculateMeanAndStdDev 函数计算数据的均值和标准差。

  • 正态分布函数:normalPDF 函数计算给定点的正态分布概率密度值。

  • 绘制曲线:在 paintEvent 中使用 QPainter 绘制曲线。

#include 
#include 
#include 
#include 
#include 
#include 

class NormalDistributionWidget : public QWidget {
public:
    NormalDistributionWidget(QWidget *parent = nullptr) : QWidget(parent) {
        // 示例数据
        data = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9};
        calculateMeanAndStdDev();
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        Q_UNUSED(event);
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing); //防走样("锯齿"现象)函数

        // 设置绘制区域
        int width = this->width();
        int height = this->height();
        painter.setPen(Qt::blue);

        // 绘制正态分布曲线
        for (int x = 0; x < width; ++x) {
            double xval = xmin + (xmax - xmin) * x / width;
            double yval = normalPDF(xval, mean, stddev);
            int y = height - (yval * height / ymax);
            painter.drawPoint(x, y);
        }
    }

private:
    QVector data;
    double mean, stddev;
    double xmin = 0, xmax = 10; // X轴范围
    double ymax = 0.5; // Y轴最大值

    void calculateMeanAndStdDev() {
        double sum = std::accumulate(data.begin(), data.end(), 0.0);
        mean = sum / data.size();

        double sq_sum = std::inner_product(data.begin(), data.end(), data.begin(), 0.0);
        stddev = std::sqrt(sq_sum / data.size() - mean * mean);
    }

    double normalPDF(double x, double mu, double sigma) {
        static const double inv_sqrt_2pi = 0.3989422804014327;  //注解1
        double a = (x - mu) / sigma;
        return inv_s

你可能感兴趣的:(Qt工作总结,开发语言,qt工作总结)