Dart中Circle类三点构造函数优化:避免重复计算圆心
Dart Circle类三点构造函数优化方案
在Dart的初始化列表中,字段的初始化按顺序执行。由于center在radius之前完成初始化,你可以直接在radius的初始化表达式中复用已赋值的center字段,彻底避免重复调用_getCenter方法:
import 'dart:math'; class Circle { final Point center; final double radius; Circle(this.center, this.radius); Circle.fromPoints(Point p1, Point p2, Point p3) : center = _getCenter(p1, p2, p3), radius = center.distanceTo(p1); // 直接使用已初始化的center static Point _getCenter(Point p1, Point p2, Point p3) { // 三点求圆心的实现逻辑示例 final x1 = p1.x, y1 = p1.y; final x2 = p2.x, y2 = p2.y; final x3 = p3.x, y3 = p3.y; final ma = (y2 - y1) / (x2 - x1); final mb = (y3 - y2) / (x3 - x2); final cx = (ma * mb * (y1 - y3) + mb * (x1 + x2) - ma * (x2 + x3)) / (2 * (mb - ma)); final cy = (-1 / ma) * (cx - (x1 + x2) / 2) + (y1 + y2) / 2; return Point(cx, cy); } }
如果遇到需要同时计算多个临时值的复杂场景,还可以用立即执行的匿名函数封装一次性计算逻辑,通过返回元组解构赋值:
Circle.fromPoints(Point p1, Point p2, Point p3) : center = ((Point c) => c)(_getCenter(p1, p2, p3)), radius = ((Point c) => c.distanceTo(p1))(_getCenter(p1, p2, p3));
不过针对当前场景,第一种直接复用已初始化center的方式最为简洁高效,既消除了重复计算,又保持了代码的可读性。
内容的提问来源于stack exchange,提问作者Jan Tosovsky
相关产品推荐
相关产品推荐

