circle_equation.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. // tools/circle_equation.dart
  2. import 'package:flutter/material.dart';
  3. import 'package:rational/rational.dart';
  4. import '../utils/math_utils.dart';
  5. class CircleEquationPage extends StatefulWidget {
  6. @override
  7. _CircleEquationPageState createState() => _CircleEquationPageState();
  8. }
  9. class _CircleEquationPageState extends State<CircleEquationPage> {
  10. final TextEditingController x1Controller = TextEditingController();
  11. final TextEditingController y1Controller = TextEditingController();
  12. final TextEditingController x2Controller = TextEditingController();
  13. final TextEditingController y2Controller = TextEditingController();
  14. final TextEditingController x3Controller = TextEditingController();
  15. final TextEditingController y3Controller = TextEditingController();
  16. String result = '';
  17. @override
  18. Widget build(BuildContext context) {
  19. return Scaffold(
  20. appBar: AppBar(title: Text('圆的方程')),
  21. body: Padding(
  22. padding: EdgeInsets.all(16),
  23. child: Column(
  24. children: [
  25. Text('请输入三个点的坐标:'),
  26. SizedBox(height: 10),
  27. Row(
  28. children: [
  29. Expanded(child: _buildInputField('点1 x', x1Controller)),
  30. SizedBox(width: 10),
  31. Expanded(child: _buildInputField('点1 y', y1Controller)),
  32. ],
  33. ),
  34. Row(
  35. children: [
  36. Expanded(child: _buildInputField('点2 x', x2Controller)),
  37. SizedBox(width: 10),
  38. Expanded(child: _buildInputField('点2 y', y2Controller)),
  39. ],
  40. ),
  41. Row(
  42. children: [
  43. Expanded(child: _buildInputField('点3 x', x3Controller)),
  44. SizedBox(width: 10),
  45. Expanded(child: _buildInputField('点3 y', y3Controller)),
  46. ],
  47. ),
  48. SizedBox(height: 20),
  49. ElevatedButton(
  50. onPressed: _calculate,
  51. child: Text('计算圆的方程'),
  52. ),
  53. SizedBox(height: 20),
  54. if (result.isNotEmpty)
  55. Card(
  56. child: Padding(
  57. padding: EdgeInsets.all(16),
  58. child: Text(
  59. result,
  60. style: TextStyle(fontSize: 14, fontFamily: 'Monospace'),
  61. ),
  62. ),
  63. ),
  64. ],
  65. ),
  66. ),
  67. );
  68. }
  69. Widget _buildInputField(String label, TextEditingController controller) {
  70. return TextField(
  71. controller: controller,
  72. keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true),
  73. decoration: InputDecoration(
  74. labelText: label,
  75. border: OutlineInputBorder(),
  76. hintText: '输入分数如: 1/2 或小数',
  77. ),
  78. );
  79. }
  80. void _calculate() {
  81. try {
  82. final x1 = MathUtils.parseRational(x1Controller.text);
  83. final y1 = MathUtils.parseRational(y1Controller.text);
  84. final x2 = MathUtils.parseRational(x2Controller.text);
  85. final y2 = MathUtils.parseRational(y2Controller.text);
  86. final x3 = MathUtils.parseRational(x3Controller.text);
  87. final y3 = MathUtils.parseRational(y3Controller.text);
  88. final z1 = x1 * x1 + y1 * y1;
  89. final z2 = x2 * x2 + y2 * y2;
  90. final z3 = x3 * x3 + y3 * y3;
  91. final solutions = MathUtils.solveLinear2(
  92. x1 - x2, y1 - y2, z2 - z1,
  93. x1 - x3, y1 - y3, z3 - z1,
  94. );
  95. final D = solutions[0];
  96. final E = solutions[1];
  97. final F = -z1 - D * x1 - E * y1;
  98. final r2 = (D * D + E * E - Rational.fromInt(4) * F)/Rational.fromInt(4);
  99. setState(() {
  100. result = '''
  101. 圆的方程: x² + y² + Dx + Ey + F = 0
  102. D = ${MathUtils.rationalToString(D)}
  103. E = ${MathUtils.rationalToString(E)}
  104. F = ${MathUtils.rationalToString(F)}
  105. 圆心: (${MathUtils.rationalToString(-D / Rational.fromInt(2))},
  106. ${MathUtils.rationalToString(-E / Rational.fromInt(2))})
  107. 半径平方: ${MathUtils.rationalToString(r2)}
  108. ''';
  109. });
  110. } catch (e) {
  111. setState(() {
  112. result = '错误: $e\n注意: 三个点不能共线';
  113. });
  114. }
  115. }
  116. @override
  117. void dispose() {
  118. x1Controller.dispose();
  119. y1Controller.dispose();
  120. x2Controller.dispose();
  121. y2Controller.dispose();
  122. x3Controller.dispose();
  123. y3Controller.dispose();
  124. super.dispose();
  125. }
  126. }