import 'dart:math' as math; import 'package:fis_measure/interfaces/date_types/point.dart'; import 'package:fis_measure/interfaces/process/calculators/output.dart'; import 'package:fis_measure/interfaces/process/items/measure_terms.dart'; import 'package:fis_measure/process/primitives/ellipse.dart'; import 'package:vid/us/vid_us_unit.dart'; import '../primitives/poyline.dart'; import 'calculator.dart'; class PolyLineAreaCal extends Calculator { PolyLineAreaCal(PolyLine ref) : super(ref); @override void calculate() { if (ref.feature == null) return; // TODO:xxx final viewport = ref.feature!.hostVisualArea!.viewport!; final points = ref.feature!.innerPoints.map((e) => viewport.convert(e)).toList(); double value = clacArea(points); final outputItem = createOutput(MeasureTerms.Area, value, VidUsUnit.cm2); final description = "${ref.description}: ${roundDouble(value)}cm²"; outputItem.updateDescription(description: description); output = outputItem; } static double clacArea(List points) { if (points.isEmpty) { return 0; } double sum = 0; var ax = points[0].x; var ay = points[0].y; for (var i = 1; i < points.length - 1; i++) { var bx = points[i].x; var by = points[i].y; var cx = points[i + 1].x; var cy = points[i + 1].y; sum += ax * by - ay * bx + ay * cx - ax * cy + bx * cy - cx * by; } return (-sum / 2).abs(); } }