Bladeren bron

修正椭圆 roi 复制绘制异常

gavin.chen 8 maanden geleden
bovenliggende
commit
50e412129a
1 gewijzigde bestanden met toevoegingen van 56 en 0 verwijderingen
  1. 56 0
      lib/process/primitives/ellipse.dart

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

@@ -10,6 +10,7 @@ import 'package:fis_measure/process/calcuators/curve.dart';
 import 'package:fis_measure/process/calcuators/formulas/general.dart';
 import 'package:fis_measure/process/workspace/urm/application.dart';
 import 'package:fis_measure/utils/canvas.dart';
+import 'package:flutter/rendering.dart';
 import 'package:path_drawing/path_drawing.dart';
 import 'package:vid/us/vid_us_unit.dart';
 import 'area_abstract.dart';
@@ -300,6 +301,61 @@ class EllipseFeature extends AreaItemFeatureAbstract {
     canvas.restore();
   }
 
+  void paintShapeFitInSize(Canvas canvas, Size size, Paint paintPan) {
+    if (innerPoints.isEmpty) return;
+
+    final xStartOffset = convert2ViewPoint(size, xAxisStart).toOffset();
+    final xEndOffset = convert2ViewPoint(size, xAxisEnd).toOffset();
+    final centroidOffset = convert2ViewPoint(size, centroid).toOffset();
+
+    final radiusX = getRadiusX(size);
+    final radiusY = getRadiusY(size);
+
+    canvas.save();
+
+    // 创建椭圆路径
+    final path = Path();
+    path.addOval(
+      Rect.fromCenter(
+        center: centroidOffset,
+        width: radiusX * 2,
+        height: radiusY * 2,
+      ),
+    );
+
+    // 计算旋转角度
+    final rotateRad = (xEndOffset - xStartOffset).direction;
+
+    // 创建一个矩阵来应用旋转
+    final rotateMatrix = Matrix4.rotationZ(rotateRad);
+    // 获取旋转后的路径
+    final rotatedPath = path.transform(rotateMatrix.storage);
+
+    // 获取外接矩形
+    final rect = rotatedPath.getBounds();
+
+    // 计算缩放比例
+    final scaleW = size.width / rect.width;
+    final scaleH = size.height / rect.height;
+    final scale = scaleW < scaleH ? scaleW : scaleH;
+
+    // 计算平移距离
+    final dx = (size.width - rect.width * scale) / 2 - rect.left * scale;
+    final dy = (size.height - rect.height * scale) / 2 - rect.top * scale;
+
+    // 应用变换
+    canvas.translate(dx, dy);
+    canvas.scale(scale, scale);
+
+    // 调整画笔宽度
+    paintPan.strokeWidth = 1 / scale;
+
+    // 绘制路径
+    canvas.drawPath(rotatedPath, paintPan);
+
+    canvas.restore();
+  }
+
   /// X轴半径
   double getRadiusX([Size? fitSize]) {
     if (innerPoints.length < 2) {