perimeter.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import 'package:fis_measure/interfaces/date_types/point.dart';
  2. import 'package:fis_measure/interfaces/process/calculators/output.dart';
  3. import 'package:fis_measure/interfaces/process/items/measure_terms.dart';
  4. import 'package:fis_measure/process/primitives/ellipse.dart';
  5. import 'package:vid/us/vid_us_unit.dart';
  6. import '../primitives/poyline.dart';
  7. import 'calculator.dart';
  8. class PolyLinePerimeterCal extends Calculator<PolyLine, double> {
  9. PolyLinePerimeterCal(PolyLine ref) : super(ref);
  10. @override
  11. void calculate() {
  12. if (ref.feature == null) return;
  13. // TODO:xxx
  14. final viewport = ref.feature!.hostVisualArea!.viewport!;
  15. final points =
  16. ref.feature!.innerPoints.map((e) => viewport.convert(e)).toList();
  17. double threshold = 0;
  18. // if (ref.Threshold.HasValue)
  19. // {
  20. // threshold = ref.Threshold.Value;
  21. // }
  22. double value = calcPerimeter(points, ref.feature!.isClosed, threshold);
  23. final outputItem = OutputItem(
  24. value: value,
  25. name: MeasureTerms.Perimeter,
  26. unit: VidUsUnit.cm,
  27. );
  28. final description =
  29. "${ref.description}: ${roundDouble(value)}${VidUsUnit.cm.name}";
  30. outputItem.updateDescription(description: description);
  31. output = outputItem;
  32. }
  33. static double calcPerimeter(
  34. List<DPoint> points,
  35. bool isClosed,
  36. double threshold,
  37. ) {
  38. if (points.length < 2) {
  39. return 0;
  40. }
  41. double sum = 0;
  42. for (int i = 1, j = 0; j < points.length && i < points.length; i++) {
  43. var length = (points[i] - points[j]).length;
  44. if (length.abs() > threshold) {
  45. sum += length;
  46. j = i;
  47. }
  48. }
  49. if (isClosed) {
  50. sum += (points[points.length - 1] - points[0]).length;
  51. }
  52. return sum;
  53. }
  54. }