| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- // 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<CircleEquationPage> {
- 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();
- }
- }
|