Browse Source

calc ellipse perimeter&area

melon.yin 2 years ago
parent
commit
77c9c951c9

+ 4 - 0
lib/interfaces/process/viewports/viewport.dart

@@ -1,6 +1,7 @@
 import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/date_types/rect_region.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
+import 'package:flutter/painting.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import '../physical_coordinates/physical_coordinate.dart';
@@ -31,6 +32,9 @@ abstract class IViewPort {
   /// Y轴单位
   VidUsUnit get yUnit;
 
+  /// 转换标准区间
+  Size get convertBoundary;
+
   /// 转换为[region]中的逻辑化坐标点
   DPoint convert(DPoint point);
 

+ 15 - 1
lib/process/calcuators/perimeter.dart

@@ -2,6 +2,7 @@ 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/types.dart';
 import 'package:fis_measure/process/primitives/ellipse.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 import '../primitives/poyline.dart';
@@ -63,6 +64,19 @@ class AreaPerimeterEllipseCal extends Calculator<Ellipse, double> {
 
   @override
   void calculate() {
-    // TODO: implement calculate
+    if (ref.feature == null) return;
+
+    final feature = ref.feature!;
+    final viewport = feature.hostVisualArea!.viewport!;
+
+    for (var output in ref.meta.outputs) {
+      if (output.name == MeasureTypes.Perimeter) {
+        var value = ref.feature!.getCircumference(viewport.convertBoundary);
+        feature.updateFloatValue(output, value, output.unit);
+      } else if (output.name == MeasureTypes.Area) {
+        var value = ref.feature!.getArea(viewport.convertBoundary);
+        feature.updateFloatValue(output, value, output.unit);
+      }
+    }
   }
 }

+ 17 - 0
lib/process/primitives/ellipse.dart

@@ -1,4 +1,5 @@
 import 'dart:ui';
+import 'dart:math' as math;
 import 'package:fis_measure/interfaces/date_types/point.dart';
 import 'package:fis_measure/interfaces/enums/items.dart';
 import 'package:fis_measure/interfaces/process/items/item.dart';
@@ -206,6 +207,22 @@ class EllipseFeature extends MeasureItemFeature {
     }
   }
 
+  /// 圆周长
+  double getCircumference([Size? fitSize]) {
+    double a = getRadiusX(fitSize), b = getRadiusY(fitSize);
+    if (a < b) {
+      a = b;
+      b = a;
+    }
+
+    return 2 * math.pi * b + 4 * (a - b);
+  }
+
+  /// 面积
+  double getArea([Size? fitSize]) {
+    return math.pi * getRadiusX(fitSize) * getRadiusY(fitSize);
+  }
+
   /// 计算Y轴坐标点
   void adjustPoints(DPoint point) {
     if (activeIndex < 1) return;

+ 8 - 0
lib/process/viewports/viewport.dart

@@ -7,6 +7,7 @@ import 'package:fis_measure/interfaces/process/viewports/logical_coordinate.dart
 import 'package:fis_measure/interfaces/process/viewports/viewport.dart';
 import 'package:fis_measure/interfaces/process/visuals/visual_area.dart';
 import 'package:flutter/foundation.dart';
+import 'package:flutter/painting.dart';
 import 'package:vid/us/vid_us_unit.dart';
 
 abstract class ViewPort<TV extends IVisualArea, T extends IPhysicalCoordinate>
@@ -78,6 +79,13 @@ abstract class ViewPort<TV extends IVisualArea, T extends IPhysicalCoordinate>
     // return DPoint(point.x * region.width, point.y * region.height);
   }
 
+  Size get convertBoundary {
+    return Size(
+      region.width / area.displayRegion.width,
+      region.height / area.displayRegion.height,
+    );
+  }
+
   @override
   DPoint convertBack(DPoint point) {
     double x = point.x / region.width;

+ 2 - 1
lib/process/workspace/application.dart

@@ -464,7 +464,8 @@ class Application implements IApplication {
           measureType: MeasureTypes.AreaPerimeterEllipse,
           description: MeasureTypes.AreaPerimeterEllipse,
           outputs: [
-            ItemOutputMeta("Perimeter", "Perimeter", VidUsUnit.cm2),
+            ItemOutputMeta("Perimeter", "Perimeter", VidUsUnit.cm),
+            ItemOutputMeta("Area", "Area", VidUsUnit.cm2),
           ],
         ),
       );