灯标点逻辑

This commit is contained in:
2026-05-04 10:25:31 +08:00
parent acbc7f1466
commit 35004b2fbb
2 changed files with 59 additions and 14 deletions

View File

@@ -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<System.Drawing.Point> brightPoints = new List<System.Drawing.Point>();
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<Point> 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);
//}
}
}

View File

@@ -25,7 +25,6 @@ namespace 头罩视野.Views
{
public partial class PageTest : Page
{
/// 只加这一个变量
private CancellationTokenSource? _cts;
private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster;