// tools/circle_equation.dart import 'package:flutter/material.dart'; import 'package:rational/rational.dart'; import '../utils/math_utils.dart'; class CircleEquationPage extends StatefulWidget { @override _CircleEquationPageState createState() => _CircleEquationPageState(); } class _CircleEquationPageState extends State { final TextEditingController x1Controller = TextEditingController(); final TextEditingController y1Controller = TextEditingController(); final TextEditingController x2Controller = TextEditingController(); final TextEditingController y2Controller = TextEditingController(); final TextEditingController x3Controller = TextEditingController(); final TextEditingController y3Controller = TextEditingController(); String result = ''; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('圆的方程')), body: Padding( padding: EdgeInsets.all(16), child: Column( children: [ Text('请输入三个点的坐标:'), SizedBox(height: 10), Row( children: [ Expanded(child: _buildInputField('点1 x', x1Controller)), SizedBox(width: 10), Expanded(child: _buildInputField('点1 y', y1Controller)), ], ), Row( children: [ Expanded(child: _buildInputField('点2 x', x2Controller)), SizedBox(width: 10), Expanded(child: _buildInputField('点2 y', y2Controller)), ], ), Row( children: [ Expanded(child: _buildInputField('点3 x', x3Controller)), SizedBox(width: 10), Expanded(child: _buildInputField('点3 y', y3Controller)), ], ), 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: 14, fontFamily: 'Monospace'), ), ), ), ], ), ), ); } Widget _buildInputField(String label, TextEditingController controller) { return TextField( controller: controller, keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true), decoration: InputDecoration( labelText: label, border: OutlineInputBorder(), hintText: '输入分数如: 1/2 或小数', ), ); } void _calculate() { try { final x1 = MathUtils.parseRational(x1Controller.text); final y1 = MathUtils.parseRational(y1Controller.text); final x2 = MathUtils.parseRational(x2Controller.text); final y2 = MathUtils.parseRational(y2Controller.text); final x3 = MathUtils.parseRational(x3Controller.text); final y3 = MathUtils.parseRational(y3Controller.text); final z1 = x1 * x1 + y1 * y1; final z2 = x2 * x2 + y2 * y2; final z3 = x3 * x3 + y3 * y3; final solutions = MathUtils.solveLinear2( x1 - x2, y1 - y2, z2 - z1, x1 - x3, y1 - y3, z3 - z1, ); final D = solutions[0]; final E = solutions[1]; final F = -z1 - D * x1 - E * y1; final r2 = (D * D + E * E - Rational.fromInt(4) * F)/Rational.fromInt(4); setState(() { result = ''' 圆的方程: x² + y² + Dx + Ey + F = 0 D = ${MathUtils.rationalToString(D)} E = ${MathUtils.rationalToString(E)} F = ${MathUtils.rationalToString(F)} 圆心: (${MathUtils.rationalToString(-D / Rational.fromInt(2))}, ${MathUtils.rationalToString(-E / Rational.fromInt(2))}) 半径平方: ${MathUtils.rationalToString(r2)} '''; }); } catch (e) { setState(() { result = '错误: $e\n注意: 三个点不能共线'; }); } } @override void dispose() { x1Controller.dispose(); y1Controller.dispose(); x2Controller.dispose(); y2Controller.dispose(); x3Controller.dispose(); y3Controller.dispose(); super.dispose(); } }