void MainWindow::drawFunction() { QString expression = ui->expressionEdit->text(); if (expression.isEmpty()) return; QCustomPlot *plot = ui->plotWidget; plot->addGraph(); plot->graph()->setPen(QPen(Qt::blue)); plot->graph()->setName(expression); double xMin = -10, xMax = 10, yMin = -10, yMax = 10; plot->xAxis->setRange(xMin, xMax); plot->yAxis->setRange(yMin, yMax); QVector<double> xValues, yValues; for (double x = xMin; x <= xMax; x += 0.1) { double y = calculate(expression, x); xValues.append(x); yValues.append(y); } plot->graph()->setData(xValues, yValues); plot->replot(); } void MainWindow::clearPlot() { QCustomPlot *plot = ui->plotWidget; plot->clearGraphs(); plot->replot(); }这是一段将函数输入框里的函数解析然后使用qcustomplot进行绘图的代码,帮我改进一下(变量名称不要改变),使其能够支持一元一次函数,幂函数、对数函数、指数函数、三角函数的图像绘制
时间: 2023-12-10 15:41:28 浏览: 125
可以使用多态性来实现不同类型函数的图像绘制。具体来说,可以定义一个抽象基类 Function,然后派生出不同类型的函数类,如 LinearFunction、PowerFunction、LogFunction、ExpFunction、SinFunction 等,这些类都要重写基类的 calculate 函数,用于计算函数在某个 x 坐标处的 y 坐标。然后在 MainWindow 类的 drawFunction 函数中,根据用户输入的函数类型,创建相应类型的函数对象,并调用其 calculate 函数计算每个 x 坐标处的 y 坐标,并将这些坐标传递给 QCustomPlot 进行绘制。
以下是修改后的代码:
```
class Function {
public:
virtual double calculate(double x) const = 0;
};
class LinearFunction : public Function {
public:
LinearFunction(double a, double b) : m_a(a), m_b(b) {}
double calculate(double x) const override {
return m_a * x + m_b;
}
private:
double m_a, m_b;
};
class PowerFunction : public Function {
public:
PowerFunction(double a, double b) : m_a(a), m_b(b) {}
double calculate(double x) const override {
return m_a * pow(x, m_b);
}
private:
double m_a, m_b;
};
class LogFunction : public Function {
public:
LogFunction(double a, double b) : m_a(a), m_b(b) {}
double calculate(double x) const override {
return m_a * log(m_b * x);
}
private:
double m_a, m_b;
};
class ExpFunction : public Function {
public:
ExpFunction(double a, double b) : m_a(a), m_b(b) {}
double calculate(double x) const override {
return m_a * exp(m_b * x);
}
private:
double m_a, m_b;
};
class SinFunction : public Function {
public:
SinFunction(double a, double b) : m_a(a), m_b(b) {}
double calculate(double x) const override {
return m_a * sin(m_b * x);
}
private:
double m_a, m_b;
};
void MainWindow::drawFunction() {
QString expression = ui->expressionEdit->text();
if (expression.isEmpty()) return;
QCustomPlot *plot = ui->plotWidget;
plot->addGraph();
plot->graph()->setPen(QPen(Qt::blue));
plot->graph()->setName(expression);
double xMin = -10, xMax = 10, yMin = -10, yMax = 10;
plot->xAxis->setRange(xMin, xMax);
plot->yAxis->setRange(yMin, yMax);
Function *function = nullptr;
QStringList tokens = expression.split(' ');
if (tokens.size() == 3) {
double a = tokens[0].toDouble();
double b = tokens[2].toDouble();
QString functionName = tokens[1];
if (functionName == "x") {
function = new LinearFunction(a, b);
} else if (functionName == "x^") {
function = new PowerFunction(a, b);
} else if (functionName == "log") {
function = new LogFunction(a, b);
} else if (functionName == "exp") {
function = new ExpFunction(a, b);
}
} else if (tokens.size() == 2) {
double a = tokens[0].toDouble();
QString functionName = tokens[1];
if (functionName == "sin") {
function = new SinFunction(a, 1);
} else if (functionName == "cos") {
function = new SinFunction(a, M_PI / 2);
} else if (functionName == "tan") {
function = new SinFunction(a, M_PI);
}
}
if (function) {
QVector<double> xValues, yValues;
for (double x = xMin; x <= xMax; x += 0.1) {
double y = function->calculate(x);
xValues.append(x);
yValues.append(y);
}
plot->graph()->setData(xValues, yValues);
delete function;
}
plot->replot();
}
void MainWindow::clearPlot() {
QCustomPlot *plot = ui->plotWidget;
plot->clearGraphs();
plot->replot();
}
```
在这个修改后的代码中,我们添加了五个不同类型的函数类,并重写了它们的 calculate 函数。在 drawFunction 函数中,我们首先根据用户输入的表达式解析出函数类型和系数,然后根据函数类型创建相应类型的函数对象,并调用它的 calculate 函数计算每个 x 坐标处的 y 坐标。最后,将这些坐标传递给 QCustomPlot 进行绘制。如果用户输入的表达式不是支持的函数类型,则不进行绘制。
阅读全文