symmetry.dart 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. // tools/symmetry.dart
  2. import 'package:flutter/material.dart';
  3. import 'package:rational/rational.dart';
  4. import '../utils/math_utils.dart';
  5. class SymmetryPage extends StatefulWidget {
  6. @override
  7. _SymmetryPageState createState() => _SymmetryPageState();
  8. }
  9. class _SymmetryPageState extends State<SymmetryPage> {
  10. int _selectedMode = 0; // 0: 点关于直线对称, 1: 直线关于点对称, 2: 直线关于直线对称
  11. // 点关于直线对称
  12. final TextEditingController pointXController = TextEditingController();
  13. final TextEditingController pointYController = TextEditingController();
  14. final TextEditingController lineAController = TextEditingController();
  15. final TextEditingController lineBController = TextEditingController();
  16. final TextEditingController lineCController = TextEditingController();
  17. // 直线关于点对称
  18. final TextEditingController line2AController = TextEditingController();
  19. final TextEditingController line2BController = TextEditingController();
  20. final TextEditingController line2CController = TextEditingController();
  21. final TextEditingController point2XController = TextEditingController();
  22. final TextEditingController point2YController = TextEditingController();
  23. // 直线关于直线对称
  24. final TextEditingController line3AController = TextEditingController();
  25. final TextEditingController line3BController = TextEditingController();
  26. final TextEditingController line3CController = TextEditingController();
  27. final TextEditingController axisAController = TextEditingController();
  28. final TextEditingController axisBController = TextEditingController();
  29. final TextEditingController axisCController = TextEditingController();
  30. String result = '';
  31. @override
  32. Widget build(BuildContext context) {
  33. return Scaffold(
  34. appBar: AppBar(title: Text('对称变换')),
  35. body: Padding(
  36. padding: EdgeInsets.all(16),
  37. child: Column(
  38. children: [
  39. DropdownButton<int>(
  40. value: _selectedMode,
  41. items: [
  42. DropdownMenuItem(value: 0, child: Text('点关于直线对称')),
  43. DropdownMenuItem(value: 1, child: Text('直线关于点对称')),
  44. DropdownMenuItem(value: 2, child: Text('直线关于直线对称')),
  45. ],
  46. onChanged: (value) {
  47. setState(() {
  48. _selectedMode = value!;
  49. result = '';
  50. });
  51. },
  52. ),
  53. SizedBox(height: 20),
  54. _buildInputs(),
  55. SizedBox(height: 20),
  56. ElevatedButton(
  57. onPressed: _calculate,
  58. child: Text('计算'),
  59. ),
  60. SizedBox(height: 20),
  61. if (result.isNotEmpty)
  62. Card(
  63. child: Padding(
  64. padding: EdgeInsets.all(16),
  65. child: Text(
  66. result,
  67. style: TextStyle(fontSize: 16),
  68. ),
  69. ),
  70. ),
  71. ],
  72. ),
  73. ),
  74. );
  75. }
  76. Widget _buildInputs() {
  77. switch (_selectedMode) {
  78. case 0:
  79. return Column(
  80. children: [
  81. Text('点坐标:'),
  82. Row(
  83. children: [
  84. Expanded(child: _buildInputField('x', pointXController)),
  85. SizedBox(width: 10),
  86. Expanded(child: _buildInputField('y', pointYController)),
  87. ],
  88. ),
  89. Text('直线方程: Ax + By + C = 0'),
  90. Row(
  91. children: [
  92. Expanded(child: _buildInputField('A', lineAController)),
  93. SizedBox(width: 10),
  94. Expanded(child: _buildInputField('B', lineBController)),
  95. SizedBox(width: 10),
  96. Expanded(child: _buildInputField('C', lineCController)),
  97. ],
  98. ),
  99. ],
  100. );
  101. case 1:
  102. return Column(
  103. children: [
  104. Text('直线方程: Ax + By + C = 0'),
  105. Row(
  106. children: [
  107. Expanded(child: _buildInputField('A', line2AController)),
  108. SizedBox(width: 10),
  109. Expanded(child: _buildInputField('B', line2BController)),
  110. SizedBox(width: 10),
  111. Expanded(child: _buildInputField('C', line2CController)),
  112. ],
  113. ),
  114. Text('点坐标:'),
  115. Row(
  116. children: [
  117. Expanded(child: _buildInputField('x', point2XController)),
  118. SizedBox(width: 10),
  119. Expanded(child: _buildInputField('y', point2YController)),
  120. ],
  121. ),
  122. ],
  123. );
  124. case 2:
  125. return Column(
  126. children: [
  127. Text('原直线: Ax + By + C = 0'),
  128. Row(
  129. children: [
  130. Expanded(child: _buildInputField('A', line3AController)),
  131. SizedBox(width: 10),
  132. Expanded(child: _buildInputField('B', line3BController)),
  133. SizedBox(width: 10),
  134. Expanded(child: _buildInputField('C', line3CController)),
  135. ],
  136. ),
  137. Text('对称轴: Ax + By + C = 0'),
  138. Row(
  139. children: [
  140. Expanded(child: _buildInputField('A', axisAController)),
  141. SizedBox(width: 10),
  142. Expanded(child: _buildInputField('B', axisBController)),
  143. SizedBox(width: 10),
  144. Expanded(child: _buildInputField('C', axisCController)),
  145. ],
  146. ),
  147. ],
  148. );
  149. default:
  150. return Container();
  151. }
  152. }
  153. Widget _buildInputField(String label, TextEditingController controller) {
  154. return TextField(
  155. controller: controller,
  156. keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true),
  157. decoration: InputDecoration(
  158. labelText: label,
  159. border: OutlineInputBorder(),
  160. ),
  161. );
  162. }
  163. void _calculate() {
  164. try {
  165. switch (_selectedMode) {
  166. case 0:
  167. _calculatePointLineSymmetry();
  168. break;
  169. case 1:
  170. _calculateLinePointSymmetry();
  171. break;
  172. case 2:
  173. _calculateLineLineSymmetry();
  174. break;
  175. }
  176. } catch (e) {
  177. setState(() {
  178. result = '错误: $e';
  179. });
  180. }
  181. }
  182. // 在 symmetry.dart 中修复相关代码
  183. void _calculatePointLineSymmetry() {
  184. final x = MathUtils.parseRational(pointXController.text);
  185. final y = MathUtils.parseRational(pointYController.text);
  186. final A = MathUtils.parseRational(lineAController.text);
  187. final B = MathUtils.parseRational(lineBController.text);
  188. final C = MathUtils.parseRational(lineCController.text);
  189. final solutions = MathUtils.solveLinear2(
  190. A, B, - (A * x + B * y + MathUtils.two * C),
  191. B, -A, B * x - A * y,
  192. );
  193. setState(() {
  194. result = '对称点: (${MathUtils.rationalToString(solutions[0])}, '
  195. '${MathUtils.rationalToString(solutions[1])})';
  196. });
  197. }
  198. void _calculateLinePointSymmetry() {
  199. final A = MathUtils.parseRational(line2AController.text);
  200. final B = MathUtils.parseRational(line2BController.text);
  201. final C = MathUtils.parseRational(line2CController.text);
  202. final x = MathUtils.parseRational(point2XController.text);
  203. final y = MathUtils.parseRational(point2YController.text);
  204. final newC = -MathUtils.two * A * x - MathUtils.two * B * y - C;
  205. setState(() {
  206. result = '对称直线方程: ${MathUtils.rationalToString(A)}x + '
  207. '${MathUtils.rationalToString(B)}y + '
  208. '${MathUtils.rationalToString(newC)} = 0';
  209. });
  210. }
  211. void _calculateLineLineSymmetry() {
  212. final P = MathUtils.parseRational(line3AController.text);
  213. final Q = MathUtils.parseRational(line3BController.text);
  214. final R = MathUtils.parseRational(line3CController.text);
  215. final A = MathUtils.parseRational(axisAController.text);
  216. final B = MathUtils.parseRational(axisBController.text);
  217. final C = MathUtils.parseRational(axisCController.text);
  218. final k = MathUtils.two * (P * A + Q * B) / (A * A + B * B);
  219. final newA = P - A * k;
  220. final newB = Q - B * k;
  221. final newC = R - C * k;
  222. setState(() {
  223. result = '对称直线方程: ${MathUtils.rationalToString(newA)}x + '
  224. '${MathUtils.rationalToString(newB)}y + '
  225. '${MathUtils.rationalToString(newC)} = 0';
  226. });
  227. }
  228. // 在 symmetry.dart 中修复 dispose 方法
  229. @override
  230. void dispose() {
  231. pointXController.dispose();
  232. pointYController.dispose();
  233. lineAController.dispose();
  234. lineBController.dispose();
  235. lineCController.dispose();
  236. line2AController.dispose();
  237. line2BController.dispose();
  238. line2CController.dispose();
  239. point2XController.dispose();
  240. point2YController.dispose();
  241. line3AController.dispose();
  242. line3BController.dispose();
  243. line3CController.dispose();
  244. axisAController.dispose();
  245. axisBController.dispose();
  246. axisCController.dispose();
  247. super.dispose();
  248. }
  249. }