symmetry.dart 8.8 KB

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