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 10:40:51 浏览: 117
可以考虑使用 QtMath 库中的函数来计算幂函数、对数函数、指数函数、三角函数的值。同时,可以使用正则表达式来判断输入的函数类型,从而选择相应的计算函数。
改进后的代码如下:
```cpp
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;
QRegExp re("(sin|cos|tan|pow|exp|log)\\((.*)\\)"); // 正则表达式匹配函数类型和参数
for (double x = xMin; x <= xMax; x += 0.1)
{
double y = 0;
if (re.indexIn(expression) != -1) // 如果匹配到函数
{
QString funcType = re.cap(1); // 获取函数类型
QString funcParam = re.cap(2); // 获取函数参数
if (funcType == "sin")
y = qSin(calculate(funcParam, x));
else if (funcType == "cos")
y = qCos(calculate(funcParam, x));
else if (funcType == "tan")
y = qTan(calculate(funcParam, x));
else if (funcType == "pow")
{
QStringList params = funcParam.split(","); // 分离参数
if (params.size() == 2)
y = qPow(calculate(params[0], x), calculate(params[1], x));
}
else if (funcType == "exp")
y = qExp(calculate(funcParam, x));
else if (funcType == "log")
y = qLn(calculate(funcParam, x));
}
else // 如果没有匹配到函数,就是普通的一元函数
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();
}
```
阅读全文