💄 Solver better delta calc
This commit is contained in:
@@ -287,7 +287,7 @@ class _CalculatorHomePageState extends State<CalculatorHomePage> {
|
|||||||
message: '平方',
|
message: '平方',
|
||||||
child: FilledButton.tonal(
|
child: FilledButton.tonal(
|
||||||
onPressed: () => _insertSymbol('^2'),
|
onPressed: () => _insertSymbol('^2'),
|
||||||
child: Text('^2', style: GoogleFonts.robotoMono()),
|
child: Text('²', style: GoogleFonts.robotoMono()),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@@ -406,7 +406,10 @@ ${b1}y &= ${c1 - a1 * x}
|
|||||||
|
|
||||||
String _expandExpressions(String input) {
|
String _expandExpressions(String input) {
|
||||||
String result = input;
|
String result = input;
|
||||||
while (true) {
|
int maxIterations = 10; // Prevent infinite loops
|
||||||
|
int iterationCount = 0;
|
||||||
|
|
||||||
|
while (iterationCount < maxIterations) {
|
||||||
String oldResult = result;
|
String oldResult = result;
|
||||||
|
|
||||||
final powerMatch = RegExp(
|
final powerMatch = RegExp(
|
||||||
@@ -431,6 +434,7 @@ ${b1}y &= ${c1 - a1 * x}
|
|||||||
final expanded =
|
final expanded =
|
||||||
'${newA}x^2${newB >= 0 ? '+' : ''}${newB}x${newC >= 0 ? '+' : ''}$newC';
|
'${newA}x^2${newB >= 0 ? '+' : ''}${newB}x${newC >= 0 ? '+' : ''}$newC';
|
||||||
result = result.replaceFirst(powerMatch.group(0)!, '($expanded)');
|
result = result.replaceFirst(powerMatch.group(0)!, '($expanded)');
|
||||||
|
iterationCount++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,11 +459,53 @@ ${b1}y &= ${c1 - a1 * x}
|
|||||||
final expanded =
|
final expanded =
|
||||||
'${newA}x^2${newB >= 0 ? '+' : ''}${newB}x${newC >= 0 ? '+' : ''}$newC';
|
'${newA}x^2${newB >= 0 ? '+' : ''}${newB}x${newC >= 0 ? '+' : ''}$newC';
|
||||||
result = result.replaceFirst(factorMulMatch.group(0)!, '($expanded)');
|
result = result.replaceFirst(factorMulMatch.group(0)!, '($expanded)');
|
||||||
|
iterationCount++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle expressions like x(expr) or (expr)x or coeff(expr)
|
||||||
|
final termFactorMatch = RegExp(
|
||||||
|
r'([+-]?(?:\d*\.?\d*)?x?)\(([^)]+)\)',
|
||||||
|
).firstMatch(result);
|
||||||
|
if (termFactorMatch != null) {
|
||||||
|
final termStr = termFactorMatch.group(1)!;
|
||||||
|
final factorStr = termFactorMatch.group(2)!;
|
||||||
|
|
||||||
|
// Skip if the term is just a sign or empty
|
||||||
|
if (termStr == '+' || termStr == '-' || termStr.isEmpty) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the term (coefficient and x power)
|
||||||
|
final termCoeffs = _parsePolynomial(termStr);
|
||||||
|
final factorCoeffs = _parsePolynomial(factorStr);
|
||||||
|
|
||||||
|
final termA = termCoeffs[1] ?? 0; // x coefficient
|
||||||
|
final termB = termCoeffs[0] ?? 0; // constant term
|
||||||
|
|
||||||
|
final factorA = factorCoeffs[1] ?? 0; // x coefficient
|
||||||
|
final factorB = factorCoeffs[0] ?? 0; // constant term
|
||||||
|
|
||||||
|
// Multiply: (termA*x + termB) * (factorA*x + factorB)
|
||||||
|
final newA = termA * factorA;
|
||||||
|
final newB = termA * factorB + termB * factorA;
|
||||||
|
final newC = termB * factorB;
|
||||||
|
|
||||||
|
final expanded =
|
||||||
|
'${newA}x^2${newB >= 0 ? '+' : ''}${newB}x${newC >= 0 ? '+' : ''}$newC';
|
||||||
|
result = result.replaceFirst(termFactorMatch.group(0)!, '($expanded)');
|
||||||
|
iterationCount++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == oldResult) break;
|
if (result == oldResult) break;
|
||||||
|
iterationCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (iterationCount >= maxIterations) {
|
||||||
|
throw Exception('表达式展开过于复杂,请简化输入。');
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,13 +21,13 @@
|
|||||||
<!-- iOS meta tags & icons -->
|
<!-- iOS meta tags & icons -->
|
||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
<meta name="apple-mobile-web-app-title" content="simple_math_calc">
|
<meta name="apple-mobile-web-app-title" content="SimpleMathCalc">
|
||||||
<link rel="apple-touch-icon" href="icons/Icon-192.png">
|
<link rel="apple-touch-icon" href="icons/Icon-192.png">
|
||||||
|
|
||||||
<!-- Favicon -->
|
<!-- Favicon -->
|
||||||
<link rel="icon" type="image/png" href="favicon.png">
|
<link rel="icon" type="image/png" href="favicon.png">
|
||||||
|
|
||||||
<title>simple_math_calc</title>
|
<title>SimpleMathCalc</title>
|
||||||
<link rel="manifest" href="manifest.json">
|
<link rel="manifest" href="manifest.json">
|
||||||
<style id="splash-screen-style">
|
<style id="splash-screen-style">
|
||||||
html {
|
html {
|
||||||
|
Reference in New Issue
Block a user