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 12:41:28 浏览: 86
可以在原有代码的基础上增加一些函数解析的逻辑,来支持更多类型的函数绘制。下面是改进后的代码:
```
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();
}
double MainWindow::calculate(QString expression, double x) {
// 支持一元一次函数 y = kx + b
if (expression.contains("x") && !expression.contains("^")) {
QStringList list = expression.split("x");
if (list.size() == 2) {
double k = list[0].toDouble();
double b = list[1].toDouble();
return k * x + b;
}
}
// 支持幂函数 y = x^n
if (expression.contains("x") && expression.contains("^")) {
QStringList list = expression.split("^");
if (list.size() == 2) {
double n = list[1].toDouble();
return pow(x, n);
}
}
// 支持对数函数 y = loga(x)
if (expression.startsWith("log")) {
QStringList list = expression.split("(");
if (list.size() == 2) {
double a = list[1].left(list[1].length() - 1).toDouble();
return log10(x) / log10(a);
}
}
// 支持指数函数 y = a^x
if (expression.contains("e^")) {
QStringList list = expression.split("^");
if (list.size() == 2) {
double a = list[0].right(list[0].length() - 1).toDouble();
return pow(a, x);
}
}
// 支持三角函数
if (expression.startsWith("sin")) {
return sin(x);
} else if (expression.startsWith("cos")) {
return cos(x);
} else if (expression.startsWith("tan")) {
return tan(x);
}
// 不支持的函数类型,返回0
return 0;
}
```
在 calculate 函数中,我们根据函数表达式的不同类型,使用不同的方法进行解析和计算。这样,我们就可以支持更多类型的函数绘制了。
阅读全文