diff --git a/头罩视野slove/头罩视野/Services/GetArea.cs b/头罩视野slove/头罩视野/Services/GetArea.cs index cb22685..04fd35b 100644 --- a/头罩视野slove/头罩视野/Services/GetArea.cs +++ b/头罩视野slove/头罩视野/Services/GetArea.cs @@ -33,21 +33,21 @@ namespace 头罩视野.Services //计算双目视野 public static double CalculateBinocularArea( - List leftFinal, - List rightFinal, - List<(int m, int n)> lightPositions) - { - // 双目并集:左眼亮 OR 右眼亮 = 亮 - int[] binocularData = new int[243]; - for (int i = 0; i < 243; i++) + List leftFinal, + List rightFinal, + List<(int m, int n)> lightPositions) { - binocularData[i] = leftFinal[i] | rightFinal[i]; - } + // 取两者中较小的长度,防止一方数据被截断 + int length = Math.Min(leftFinal.Count, rightFinal.Count); + int[] binocularData = new int[length]; - // 计算面积 + for (int i = 0; i < length; i++) + { + binocularData[i] = leftFinal[i] | rightFinal[i]; + } + System.Diagnostics.Debug.WriteLine($"【双目亮灯】长度:{length}, 左眼亮灯:{leftFinal.Count}, 右眼亮灯:{rightFinal.Count}, 双目亮灯:{binocularData.Length}"); return CalculateEllipseArea(binocularData, lightPositions); - } - + } //下方视野 下方视野角度 = 人眼到「最低亮灯条」的夹角 diff --git a/头罩视野slove/头罩视野/Views/PageTest.xaml.cs b/头罩视野slove/头罩视野/Views/PageTest.xaml.cs index 69124d4..2043458 100644 --- a/头罩视野slove/头罩视野/Views/PageTest.xaml.cs +++ b/头罩视野slove/头罩视野/Views/PageTest.xaml.cs @@ -121,7 +121,7 @@ namespace 头罩视野.Views testTimer.Stop(); } - + //测试按钮 private async void Button_Click_Test(object sender, RoutedEventArgs e) { if (_isTesting) @@ -152,8 +152,8 @@ namespace 头罩视野.Views //maxBottomViewAngle = 0; // 初始化:全部设为0(灭) - _leftFinalData = Enumerable.Repeat(0, 243).ToList(); - _rightFinalData = Enumerable.Repeat(0, 243).ToList(); + //_leftFinalData = Enumerable.Repeat(0, 240).ToList(); + //_rightFinalData = Enumerable.Repeat(0, 240).ToList(); // 面积也清空 @@ -206,8 +206,9 @@ namespace 头罩视野.Views { // ✅ 传值调用:把左右眼最终数据传给方法 _binocularTotalArea = GetArea.CalculateBinocularArea( _leftFinalData,_rightFinalData, _lightPositions); + //= (_leftTotalArea + _rightTotalArea) - congdie; // 显示到界面 - smsyarea.Text = _binocularTotalArea.ToString("0.00"); + smsyarea.Text =_binocularTotalArea.ToString("0.00"); // 视野保存率(如果需要) double binocularRateD = GetArea.CalcVisionRate(_binocularTotalArea); @@ -291,10 +292,7 @@ namespace 头罩视野.Views } } - /// - /// 采集当前水平角度下的灯条数据,计算该角度的视野面积贡献,并累加到总视野面积中。 - /// 每次调用只采集一次数据(对应一个水平角度,比如 10°、20°…)。 - /// + //计算 private async Task calCurrentangle() { await ReadLightBarData(); @@ -319,27 +317,47 @@ namespace 头罩视野.Views // 5. 根据当前测试模式(左眼/右眼/双目),累加面积 if (isLeftOnly) { + //System.Diagnostics.Debug.WriteLine($"lightData 实际长度: {lightData.Length}"); _leftTotalArea += singleArea; // 实时合并左眼:只要亮过一次,就永久亮 - for (int i = 0; i < 243; i++) - { - if (lightData[i] == 1) - _leftFinalData[i] = 1; - } + + // 安全获取真实长度 + int realLength = lightData.Length; + + // 初始化最终数据(永远和 lightData 一样长,不会错) + if (_leftFinalData == null || _leftFinalData.Count != realLength) + { + _leftFinalData = new List(new int[realLength]); + } + + for (int i = 0; i < realLength; i++) + { + if (lightData[i] == 1) + { + _leftFinalData[i] = 1; + } + } + } else if (isRightOnly) { _rightTotalArea += singleArea; - // 实时合并右眼 - for (int i = 0; i < 243; i++) + int realLength = lightData.Length; + + if (_rightFinalData == null || _rightFinalData.Count != realLength) + { + _rightFinalData = new List(new int[realLength]); + } + + for (int i = 0; i < realLength; i++) { if (lightData[i] == 1) + { _rightFinalData[i] = 1; + } } } - - // 6. 更新下方视野的最大值(取所有角度中最大的) if (bottomViewAngle > maxBottomViewAngle)