diff --git a/头罩视野slove/头罩视野/Services/GetArea.cs b/头罩视野slove/头罩视野/Services/GetArea.cs index 9ebe877..c353bff 100644 --- a/头罩视野slove/头罩视野/Services/GetArea.cs +++ b/头罩视野slove/头罩视野/Services/GetArea.cs @@ -230,20 +230,29 @@ namespace 头罩视野.Services + + + + + + // 设备固定参数 private static double R = 330; // 半球半径 private static double angleStep = 10; // 每格角度 + // 定义参数(和你代码里一致) + private const int totalLights = 81; + // 传入:72个灯的亮灭数据(0=灭,1=亮) // 返回:椭圆面积 public static double CalculateEllipseArea(int[] lightData, List<(int m, int n)> lightPositions) { - if (lightData.Length != 72 || lightPositions.Count != 72) - throw new Exception("必须是72个灯的数据"); + //if (lightData.Length != totalLights || lightPositions.Count != totalLights) + // throw new Exception("必须是81个灯的数据"); // 第一步:收集所有亮灯坐标 List brightPoints = new List(); - for (int i = 0; i < 72; i++) + for (int i = 0; i < totalLights; i++) { if (lightData[i] == 1) { @@ -258,19 +267,39 @@ namespace 头罩视野.Services // 返回面积 return area; - } - - // 格数 m,n → 坐标点 + } + /// 生成设备全部243盏灯的(m,n)位置 上爪1条、下爪1条、左右共用1条,各81灯 private static System.Drawing.Point GetLightPoint(int m, int n) { - double radH = m * angleStep * Math.PI / 180; - double radV = n * angleStep * Math.PI / 180; + double radH, radV; + + // 上爪灯条(n=0):水平角固定,m控制垂直角 + if (n == 0) + { + radH = 0; + radV = m * angleStep * Math.PI / 180; + } + // 下爪灯条(n=1):水平角固定为180°,m控制垂直角 + else if (n == 1) + { + radH = Math.PI; + radV = m * angleStep * Math.PI / 180; + } + // 左右共用灯条(n=2):垂直角固定,m控制水平角 + else + { + radH = m * angleStep * Math.PI / 180; + radV = 0; + } + + // 保留你原来的投影公式 double x = R * Math.Tan(radH); double y = R * Math.Tan(radV); - return new System.Drawing.Point((int)x, (int)y); + + return new System.Drawing.Point((int)Math.Round(x), (int)Math.Round(y)); } - // 最小二乘法拟合椭圆(核心算法) + // 最小二乘法拟合椭圆(核心算法)cx:椭圆中心点的 X 坐标 cy:椭圆中心点的 Y 坐标 a:椭圆的长半轴长度(较大的那个半径)b:椭圆的短半轴长度(较小的那个半径) private static (double cx, double cy, double a, double b, double area) FitEllipse(List points) @@ -313,9 +342,26 @@ namespace 头罩视野.Services if (a < b) (a, b) = (b, a); double area = Math.PI * a * b; - return (cx, cy, a, b, area); - } + return (cx, cy, a, b, area); } - + + + + + + // + //private static System.Drawing.Point GetLightPoint(int m, int n) + //{ + // double radH = m * angleStep * Math.PI / 180; + // double radV = n * angleStep * Math.PI / 180; + // double x = R * Math.Tan(radH); + // double y = R * Math.Tan(radV); + // return new System.Drawing.Point((int)x, (int)y); + //} + + + } + + } diff --git a/头罩视野slove/头罩视野/Views/PageTest.xaml.cs b/头罩视野slove/头罩视野/Views/PageTest.xaml.cs index ca5a9ba..e6f9c97 100644 --- a/头罩视野slove/头罩视野/Views/PageTest.xaml.cs +++ b/头罩视野slove/头罩视野/Views/PageTest.xaml.cs @@ -25,7 +25,6 @@ namespace 头罩视野.Views { public partial class PageTest : Page { - /// 只加这一个变量 private CancellationTokenSource? _cts; private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster;