From c9d2f49eda19c5a5c31a4465944fe7513dfa8f99 Mon Sep 17 00:00:00 2001 From: "Mr.Xia" <1424473282@qq.com> Date: Mon, 25 May 2026 16:43:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=203.175=E5=A4=96=E5=9B=B4=E5=AD=94?= =?UTF-8?q?=E9=97=B4=E8=B7=9D=E7=AE=97=E6=B3=95=EF=BC=8C=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E8=BD=AE=E5=BB=93=E5=BC=8F=E5=88=86=E5=B8=83=E5=92=8C=E4=BE=A7?= =?UTF-8?q?=E9=9D=A2=E5=87=B8=E5=87=BA=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 旧算法要求最上/最下排各≥2个点,无法处理角上只有单个孔的板边轮廓分布。 新算法:X间距取上下排边缘点的极值(过滤侧面凸出点),Y间距取所有点极值。 Co-Authored-By: Claude Opus 4.7 --- MainWindowViewModel.cs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/MainWindowViewModel.cs b/MainWindowViewModel.cs index 54cb469..cd80745 100644 --- a/MainWindowViewModel.cs +++ b/MainWindowViewModel.cs @@ -1935,20 +1935,30 @@ M30"; if (points.Count < 4) return; - double topY = points.Max(point => point.Y); - double bottomY = points.Min(point => point.Y); + double minY = points.Min(point => point.Y); + double maxY = points.Max(point => point.Y); - var topRowPoints = points.Where(point => Math.Abs(point.Y - topY) < 0.0001).ToList(); - var bottomRowPoints = points.Where(point => Math.Abs(point.Y - bottomY) < 0.0001).ToList(); + // X间距:取最上排和最下排点的X极值,过滤侧面凸出的异常点 + var edgePoints = points.Where(point => Math.Abs(point.Y - maxY) < 0.0001 || Math.Abs(point.Y - minY) < 0.0001).ToList(); + double edgeMinX = edgePoints.Min(point => point.X); + double edgeMaxX = edgePoints.Max(point => point.X); - if (topRowPoints.Count < 2 || bottomRowPoints.Count < 2) - return; + double minX, maxX; + if (Math.Abs(edgeMaxX - edgeMinX) > 0.0001) + { + // 上下排有多于1个不同的X值,说明是矩形布局 + minX = edgeMinX; + maxX = edgeMaxX; + } + else + { + // 上下排X全部相同(垂直排列),退回所有点的X极值 + minX = points.Min(point => point.X); + maxX = points.Max(point => point.X); + } - double leftX = Math.Min(topRowPoints.Min(point => point.X), bottomRowPoints.Min(point => point.X)); - double rightX = Math.Max(topRowPoints.Max(point => point.X), bottomRowPoints.Max(point => point.X)); - - Outer3175XSpacing = Math.Round(rightX - leftX, 3, MidpointRounding.AwayFromZero); - Outer3175YSpacing = Math.Round(topY - bottomY, 3, MidpointRounding.AwayFromZero); + Outer3175XSpacing = Math.Round(maxX - minX, 3, MidpointRounding.AwayFromZero); + Outer3175YSpacing = Math.Round(maxY - minY, 3, MidpointRounding.AwayFromZero); HasOuter3175Spacing = true; Debug.WriteLine($"[3.175外围孔] X间距={Outer3175XSpacing:F3}, Y间距={Outer3175YSpacing:F3}");