This commit is contained in:
2026-05-07 17:09:01 +08:00
parent 165855c50b
commit 39f5e9ca67
2 changed files with 47 additions and 29 deletions

View File

@@ -33,21 +33,21 @@ namespace 头罩视野.Services
//计算双目视野
public static double CalculateBinocularArea(
List<int> leftFinal,
List<int> rightFinal,
List<(int m, int n)> lightPositions)
{
// 双目并集:左眼亮 OR 右眼亮 = 亮
int[] binocularData = new int[243];
for (int i = 0; i < 243; i++)
List<int> leftFinal,
List<int> 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);
}
}
//下方视野 下方视野角度 = 人眼到「最低亮灯条」的夹角

View File

@@ -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
}
}
/// <summary>
/// 采集当前水平角度下的灯条数据,计算该角度的视野面积贡献,并累加到总视野面积中。
/// 每次调用只采集一次数据(对应一个水平角度,比如 10°、20°…
/// </summary>
//计算
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<int>(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<int>(new int[realLength]);
}
for (int i = 0; i < realLength; i++)
{
if (lightData[i] == 1)
{
_rightFinalData[i] = 1;
}
}
}
// 6. 更新下方视野的最大值(取所有角度中最大的)
if (bottomViewAngle > maxBottomViewAngle)