| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- // tools/symmetry.dart
- import 'package:flutter/material.dart';
- import '../utils/math_utils.dart';
- class SymmetryPage extends StatefulWidget {
- @override
- _SymmetryPageState createState() => _SymmetryPageState();
- }
- class _SymmetryPageState extends State<SymmetryPage> {
- 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<int>(
- 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();
- }
- }
|