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 09:41:50 浏览: 122
Brackets-MainWindow:永远不会忘记主窗口!
可以考虑使用一个 switch 语句,根据用户输入的函数类型来选择具体的函数计算方法。以下是改进后的代码:
```
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 = 0.0;
switch (getFunctionType(expression)) {
case FunctionType::Linear:
y = calculateLinear(expression, x);
break;
case FunctionType::Power:
y = calculatePower(expression, x);
break;
case FunctionType::Logarithmic:
y = calculateLogarithmic(expression, x);
break;
case FunctionType::Exponential:
y = calculateExponential(expression, x);
break;
case FunctionType::Trigonometric:
y = calculateTrigonometric(expression, x);
break;
default:
break;
}
xValues.append(x);
yValues.append(y);
}
plot->graph()->setData(xValues, yValues);
plot->replot();
}
void MainWindow::clearPlot() {
QCustomPlot *plot = ui->plotWidget;
plot->clearGraphs();
plot->replot();
}
MainWindow::FunctionType MainWindow::getFunctionType(const QString &expression) {
// 根据函数表达式判断函数类型
if (expression.contains("x")) {
if (expression.contains("^")) {
return FunctionType::Power;
} else if (expression.contains("log")) {
return FunctionType::Logarithmic;
} else if (expression.contains("exp")) {
return FunctionType::Exponential;
} else if (expression.contains("sin") || expression.contains("cos") || expression.contains("tan")) {
return FunctionType::Trigonometric;
} else {
return FunctionType::Linear;
}
} else {
return FunctionType::Unknown;
}
}
double MainWindow::calculateLinear(const QString &expression, double x) {
// 计算一元一次函数
QRegExp rx("(\\d*[.]?\\d*)\\s*\\*?\\s*x\\s*([+\\-]\\s*\\d*[.]?\\d*)?");
if (rx.indexIn(expression) != -1) {
double a = rx.cap(1).toDouble();
double b = rx.cap(2).toDouble();
return a * x + b;
} else {
return 0.0;
}
}
double MainWindow::calculatePower(const QString &expression, double x) {
// 计算幂函数
QRegExp rx("(\\d*[.]?\\d*)\\s*\\*?\\s*x\\s*\\^\\s*(\\d*[.]?\\d*)");
if (rx.indexIn(expression) != -1) {
double a = rx.cap(1).toDouble();
double n = rx.cap(2).toDouble();
return pow(a * x, n);
} else {
return 0.0;
}
}
double MainWindow::calculateLogarithmic(const QString &expression, double x) {
// 计算对数函数
if (expression.startsWith("log")) {
double base = 10.0;
QString baseStr = expression.mid(3);
if (!baseStr.isEmpty()) {
base = baseStr.toDouble();
}
return log(x) / log(base);
} else {
return 0.0;
}
}
double MainWindow::calculateExponential(const QString &expression, double x) {
// 计算指数函数
if (expression.startsWith("exp")) {
return exp(x);
} else {
return 0.0;
}
}
double MainWindow::calculateTrigonometric(const QString &expression, double x) {
// 计算三角函数
if (expression.startsWith("sin")) {
return sin(x);
} else if (expression.startsWith("cos")) {
return cos(x);
} else if (expression.startsWith("tan")) {
return tan(x);
} else {
return 0.0;
}
}
```
其中,`getFunctionType` 函数用于根据用户输入的函数表达式判断函数类型,`calculateLinear`、`calculatePower`、`calculateLogarithmic`、`calculateExponential` 和 `calculateTrigonometric` 分别用于计算一元一次函数、幂函数、对数函数、指数函数和三角函数。在 `drawFunction` 函数中,通过 switch 语句来选择具体的计算方法,并将计算结果添加到 `xValues` 和 `yValues` 中。
阅读全文