🐛 Fix some tri angles values
This commit is contained in:
		
							
								
								
									
										125
									
								
								lib/solver.dart
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								lib/solver.dart
									
									
									
									
									
								
							| @@ -63,6 +63,15 @@ class SolverService { | ||||
|       ), | ||||
|     ); | ||||
|  | ||||
|     // 检查是否为特殊三角函数值,可以返回精确结果 | ||||
|     final exactTrigResult = _getExactTrigResult(input); | ||||
|     if (exactTrigResult != null) { | ||||
|       return CalculationResult( | ||||
|         steps: steps, | ||||
|         finalAnswer: '\$\$$exactTrigResult\$\$', | ||||
|       ); | ||||
|     } | ||||
|  | ||||
|     // 预处理输入,将三角函数的参数从度转换为弧度 | ||||
|     String processedInput = _convertTrigToRadians(input); | ||||
|  | ||||
| @@ -431,6 +440,122 @@ ${b1}y &= ${c1 - a1 * x} | ||||
|  | ||||
|   /// ---- 辅助函数 ---- | ||||
|  | ||||
|   /// 获取精确三角函数结果 | ||||
|   String? _getExactTrigResult(String input) { | ||||
|     final cleanInput = input.replaceAll(' ', '').toLowerCase(); | ||||
|  | ||||
|     // 匹配 sin(角度) 模式 | ||||
|     final sinMatch = RegExp(r'^sin\((\d+(?:\+\d+)*)\)$').firstMatch(cleanInput); | ||||
|     if (sinMatch != null) { | ||||
|       final angleExpr = sinMatch.group(1)!; | ||||
|       final angle = _evaluateAngleExpression(angleExpr); | ||||
|       if (angle != null) { | ||||
|         return _getSinExactValue(angle); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // 匹配 cos(角度) 模式 | ||||
|     final cosMatch = RegExp(r'^cos\((\d+(?:\+\d+)*)\)$').firstMatch(cleanInput); | ||||
|     if (cosMatch != null) { | ||||
|       final angleExpr = cosMatch.group(1)!; | ||||
|       final angle = _evaluateAngleExpression(angleExpr); | ||||
|       if (angle != null) { | ||||
|         return _getCosExactValue(angle); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     // 匹配 tan(角度) 模式 | ||||
|     final tanMatch = RegExp(r'^tan\((\d+(?:\+\d+)*)\)$').firstMatch(cleanInput); | ||||
|     if (tanMatch != null) { | ||||
|       final angleExpr = tanMatch.group(1)!; | ||||
|       final angle = _evaluateAngleExpression(angleExpr); | ||||
|       if (angle != null) { | ||||
|         return _getTanExactValue(angle); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   /// 计算角度表达式(如 30+45 = 75) | ||||
|   int? _evaluateAngleExpression(String expr) { | ||||
|     final parts = expr.split('+'); | ||||
|     int sum = 0; | ||||
|     for (final part in parts) { | ||||
|       final num = int.tryParse(part.trim()); | ||||
|       if (num == null) return null; | ||||
|       sum += num; | ||||
|     } | ||||
|     return sum; | ||||
|   } | ||||
|  | ||||
|   /// 获取 sin 的精确值 | ||||
|   String? _getSinExactValue(int angle) { | ||||
|     // 标准化角度到 0-360 度 | ||||
|     final normalizedAngle = angle % 360; | ||||
|  | ||||
|     switch (normalizedAngle) { | ||||
|       case 0: | ||||
|       case 360: | ||||
|         return '0'; | ||||
|       case 30: | ||||
|         return '\\frac{1}{2}'; | ||||
|       case 45: | ||||
|         return '\\frac{\\sqrt{2}}{2}'; | ||||
|       case 60: | ||||
|         return '\\frac{\\sqrt{3}}{2}'; | ||||
|       case 75: | ||||
|         return '1 + \\frac{\\sqrt{2}}{2}'; | ||||
|       case 90: | ||||
|         return '1'; | ||||
|       case 120: | ||||
|         return '\\frac{\\sqrt{3}}{2}'; | ||||
|       case 135: | ||||
|         return '\\frac{\\sqrt{2}}{2}'; | ||||
|       case 150: | ||||
|         return '\\frac{1}{2}'; | ||||
|       case 180: | ||||
|         return '0'; | ||||
|       case 210: | ||||
|         return '-\\frac{1}{2}'; | ||||
|       case 225: | ||||
|         return '-\\frac{\\sqrt{2}}{2}'; | ||||
|       case 240: | ||||
|         return '-\\frac{\\sqrt{3}}{2}'; | ||||
|       case 270: | ||||
|         return '-1'; | ||||
|       case 300: | ||||
|         return '-\\frac{\\sqrt{3}}{2}'; | ||||
|       case 315: | ||||
|         return '-\\frac{\\sqrt{2}}{2}'; | ||||
|       case 330: | ||||
|         return '-\\frac{1}{2}'; | ||||
|       default: | ||||
|         return null; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /// 获取 cos 的精确值 | ||||
|   String? _getCosExactValue(int angle) { | ||||
|     // cos(angle) = sin(90 - angle) | ||||
|     final complementaryAngle = 90 - angle; | ||||
|     return _getSinExactValue(complementaryAngle.abs()); | ||||
|   } | ||||
|  | ||||
|   /// 获取 tan 的精确值 | ||||
|   String? _getTanExactValue(int angle) { | ||||
|     // tan(angle) = sin(angle) / cos(angle) | ||||
|     final sinValue = _getSinExactValue(angle); | ||||
|     final cosValue = _getCosExactValue(angle); | ||||
|  | ||||
|     if (sinValue != null && cosValue != null) { | ||||
|       if (cosValue == '0') return null; // 未定义 | ||||
|       return '\\frac{$sinValue}{$cosValue}'; | ||||
|     } | ||||
|  | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   /// 将三角函数的参数从度转换为弧度 | ||||
|   String _convertTrigToRadians(String input) { | ||||
|     String result = input; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user