// tools/symmetry.dart import 'package:flutter/material.dart'; import 'package:rational/rational.dart'; import '../utils/math_utils.dart'; class SymmetryPage extends StatefulWidget { @override _SymmetryPageState createState() => _SymmetryPageState(); } class _SymmetryPageState extends State { int _selectedMode = 0; // 0: 点关于直线对称, 1: 直线关于点对称, 2: 直线关于直线对称 // 点关于直线对称 final TextEditingController pointXController = TextEditingController(); final TextEditingController pointYController = TextEditingController(); final TextEditingController lineAController = TextEditingController(); final TextEditingController lineBController = TextEditingController(); final TextEditingController lineCController = TextEditingController(); // 直线关于点对称 final TextEditingController line2AController = TextEditingController(); final TextEditingController line2BController = TextEditingController(); final TextEditingController line2CController = TextEditingController(); final TextEditingController point2XController = TextEditingController(); final TextEditingController point2YController = TextEditingController(); // 直线关于直线对称 final TextEditingController line3AController = TextEditingController(); final TextEditingController line3BController = TextEditingController(); final TextEditingController line3CController = TextEditingController(); final TextEditingController axisAController = TextEditingController(); final TextEditingController axisBController = TextEditingController(); final TextEditingController axisCController = TextEditingController(); String result = ''; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('对称变换')), body: Padding( padding: EdgeInsets.all(16), child: Column( children: [ DropdownButton( value: _selectedMode, items: [ DropdownMenuItem(value: 0, child: Text('点关于直线对称')), DropdownMenuItem(value: 1, child: Text('直线关于点对称')), DropdownMenuItem(value: 2, child: Text('直线关于直线对称')), ], onChanged: (value) { setState(() { _selectedMode = value!; result = ''; }); }, ), SizedBox(height: 20), _buildInputs(), SizedBox(height: 20), ElevatedButton( onPressed: _calculate, child: Text('计算'), ), SizedBox(height: 20), if (result.isNotEmpty) Card( child: Padding( padding: EdgeInsets.all(16), child: Text( result, style: TextStyle(fontSize: 16), ), ), ), ], ), ), ); } Widget _buildInputs() { switch (_selectedMode) { case 0: return Column( children: [ Text('点坐标:'), Row( children: [ Expanded(child: _buildInputField('x', pointXController)), SizedBox(width: 10), Expanded(child: _buildInputField('y', pointYController)), ], ), Text('直线方程: Ax + By + C = 0'), Row( children: [ Expanded(child: _buildInputField('A', lineAController)), SizedBox(width: 10), Expanded(child: _buildInputField('B', lineBController)), SizedBox(width: 10), Expanded(child: _buildInputField('C', lineCController)), ], ), ], ); case 1: return Column( children: [ Text('直线方程: Ax + By + C = 0'), Row( children: [ Expanded(child: _buildInputField('A', line2AController)), SizedBox(width: 10), Expanded(child: _buildInputField('B', line2BController)), SizedBox(width: 10), Expanded(child: _buildInputField('C', line2CController)), ], ), Text('点坐标:'), Row( children: [ Expanded(child: _buildInputField('x', point2XController)), SizedBox(width: 10), Expanded(child: _buildInputField('y', point2YController)), ], ), ], ); case 2: return Column( children: [ Text('原直线: Ax + By + C = 0'), Row( children: [ Expanded(child: _buildInputField('A', line3AController)), SizedBox(width: 10), Expanded(child: _buildInputField('B', line3BController)), SizedBox(width: 10), Expanded(child: _buildInputField('C', line3CController)), ], ), Text('对称轴: Ax + By + C = 0'), Row( children: [ Expanded(child: _buildInputField('A', axisAController)), SizedBox(width: 10), Expanded(child: _buildInputField('B', axisBController)), SizedBox(width: 10), Expanded(child: _buildInputField('C', axisCController)), ], ), ], ); default: return Container(); } } Widget _buildInputField(String label, TextEditingController controller) { return TextField( controller: controller, keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true), decoration: InputDecoration( labelText: label, border: OutlineInputBorder(), ), ); } void _calculate() { try { switch (_selectedMode) { case 0: _calculatePointLineSymmetry(); break; case 1: _calculateLinePointSymmetry(); break; case 2: _calculateLineLineSymmetry(); break; } } catch (e) { setState(() { result = '错误: $e'; }); } } // 在 symmetry.dart 中修复相关代码 void _calculatePointLineSymmetry() { final x = MathUtils.parseRational(pointXController.text); final y = MathUtils.parseRational(pointYController.text); final A = MathUtils.parseRational(lineAController.text); final B = MathUtils.parseRational(lineBController.text); final C = MathUtils.parseRational(lineCController.text); final solutions = MathUtils.solveLinear2( A, B, - (A * x + B * y + MathUtils.two * C), B, -A, B * x - A * y, ); setState(() { result = '对称点: (${MathUtils.rationalToString(solutions[0])}, ' '${MathUtils.rationalToString(solutions[1])})'; }); } void _calculateLinePointSymmetry() { final A = MathUtils.parseRational(line2AController.text); final B = MathUtils.parseRational(line2BController.text); final C = MathUtils.parseRational(line2CController.text); final x = MathUtils.parseRational(point2XController.text); final y = MathUtils.parseRational(point2YController.text); final newC = -MathUtils.two * A * x - MathUtils.two * B * y - C; setState(() { result = '对称直线方程: ${MathUtils.rationalToString(A)}x + ' '${MathUtils.rationalToString(B)}y + ' '${MathUtils.rationalToString(newC)} = 0'; }); } void _calculateLineLineSymmetry() { final P = MathUtils.parseRational(line3AController.text); final Q = MathUtils.parseRational(line3BController.text); final R = MathUtils.parseRational(line3CController.text); final A = MathUtils.parseRational(axisAController.text); final B = MathUtils.parseRational(axisBController.text); final C = MathUtils.parseRational(axisCController.text); final k = MathUtils.two * (P * A + Q * B) / (A * A + B * B); final newA = P - A * k; final newB = Q - B * k; final newC = R - C * k; setState(() { result = '对称直线方程: ${MathUtils.rationalToString(newA)}x + ' '${MathUtils.rationalToString(newB)}y + ' '${MathUtils.rationalToString(newC)} = 0'; }); } // 在 symmetry.dart 中修复 dispose 方法 @override void dispose() { pointXController.dispose(); pointYController.dispose(); lineAController.dispose(); lineBController.dispose(); lineCController.dispose(); line2AController.dispose(); line2BController.dispose(); line2CController.dispose(); point2XController.dispose(); point2YController.dispose(); line3AController.dispose(); line3BController.dispose(); line3CController.dispose(); axisAController.dispose(); axisBController.dispose(); axisCController.dispose(); super.dispose(); } }