♻️ Replace the math expressions with own calculator

This commit is contained in:
2025-09-14 13:19:56 +08:00
parent 722ef9ca21
commit 2a56a83898
4 changed files with 90 additions and 13 deletions

View File

@@ -3,7 +3,8 @@ import 'package:latext/latext.dart';
import 'package:simple_math_calc/models/calculation_step.dart';
import 'package:simple_math_calc/solver.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:math_expressions/math_expressions.dart' as math_expressions;
import 'package:simple_math_calc/calculator.dart';
import 'package:simple_math_calc/parser.dart';
import 'dart:math';
class CalculatorHomePage extends StatefulWidget {
@@ -70,11 +71,8 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
);
// 解析表达式
final parser = math_expressions.ShuntingYardParser();
final expr = parser.parse(functionExpr);
// 创建变量 x
final x = math_expressions.Variable('x');
final parser = Parser(functionExpr);
final expr = parser.parse();
// 根据缩放因子动态调整范围和步长
final range = 10.0 * zoomFactor;
@@ -84,13 +82,15 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
List<FlSpot> points = [];
for (double i = -range; i <= range; i += step) {
try {
final context = math_expressions.ContextModel()
..bindVariable(x, math_expressions.Number(i));
final evaluator = math_expressions.RealEvaluator(context);
final y = evaluator.evaluate(expr);
// 替换变量 x 为当前值
final substituted = expr.substitute('x', DoubleExpr(i));
final evaluated = substituted.evaluate();
if (y.isFinite && !y.isNaN) {
points.add(FlSpot(i, y.toDouble()));
if (evaluated is DoubleExpr) {
final y = evaluated.value;
if (y.isFinite && !y.isNaN) {
points.add(FlSpot(i, y));
}
}
} catch (e) {
// 跳过无法计算的点