From 98e16ea7200e04f901c3a45ecd095f440043b3e3 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Fri, 12 Jun 2026 11:32:17 +0800 Subject: [PATCH] =?UTF-8?q?CloudDispersal=E5=8A=A0SalvoRounds/Spacing,=20F?= =?UTF-8?q?ireSchedule=E6=8C=89=E9=97=B4=E9=9A=94=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E4=BA=91=E5=9B=A2,=20=E6=8B=A6=E6=88=AA=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Algorithms/DefaultDefenseAdvisor.cs | 36 ++++++++----------- .../Models/CloudDispersal.cs | 5 +++ .../Scripts/Managers/SimulationRunner.cs | 12 +++---- .../FullPipelineTests.cs | 7 ++-- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/CounterDrone.Core/Algorithms/DefaultDefenseAdvisor.cs b/src/CounterDrone.Core/Algorithms/DefaultDefenseAdvisor.cs index 3707f96..44aebf8 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultDefenseAdvisor.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultDefenseAdvisor.cs @@ -105,26 +105,21 @@ namespace CounterDrone.Core.Algorithms var expansionTime = (float)Math.Pow((effectiveR - r0) / k, 2); var recommendedTiming = halfTime - expansionTime; - var cloudSalvo = new List(); - for (int i = 0; i < roundsNeeded; i++) + var bestCloud = new CloudDispersal { - var offset = (i - (roundsNeeded - 1) / 2f) * spacing; - cloudSalvo.Add(new CloudDispersal - { - AerosolType = (int)aerosolType, - PositionX = mid.X + offset, - PositionY = mid.Y, - PositionZ = mid.Z, - DisperseHeight = (float)target.TypicalAltitude, - TriggerMode = (int)TriggerMode.Time, - Duration = (int)maxDur, - InitialScale = ammo.InitialVolume, - ReleaseMode = (int)ReleaseMode.Single, - Source = "Algorithm", - PositionMode = (int)PositionMode.AlgorithmRecommended, - RecommendedTiming = recommendedTiming, - }); - } + AerosolType = (int)aerosolType, + PositionX = mid.X, PositionY = mid.Y, PositionZ = mid.Z, + DisperseHeight = (float)target.TypicalAltitude, + TriggerMode = (int)TriggerMode.Time, + Duration = (int)maxDur, + InitialScale = ammo.InitialVolume, + ReleaseMode = (int)ReleaseMode.Single, + Source = "Algorithm", + PositionMode = (int)PositionMode.AlgorithmRecommended, + RecommendedTiming = recommendedTiming, + SalvoRounds = roundsNeeded, + SalvoSpacing = spacing, + }; // 平台部署:假设齐射(同时发射),每门炮打一发后冷却 5s // 需要 roundsNeeded 门炮同时发射 @@ -146,8 +141,7 @@ namespace CounterDrone.Core.Algorithms { RecommendedAerosolType = aerosolType, AerosolRationale = rationale, - RecommendedCloud = cloudSalvo[0], - CloudSalvo = cloudSalvo, + RecommendedCloud = bestCloud, SalvoRounds = roundsNeeded, SalvoSpacing = spacing, Platforms = platforms, diff --git a/src/CounterDrone.Core/Models/CloudDispersal.cs b/src/CounterDrone.Core/Models/CloudDispersal.cs index cf3ccc7..719cebb 100644 --- a/src/CounterDrone.Core/Models/CloudDispersal.cs +++ b/src/CounterDrone.Core/Models/CloudDispersal.cs @@ -45,5 +45,10 @@ namespace CounterDrone.Core.Models public double? CriticalPosY { get; set; } public double? CriticalPosZ { get; set; } public double? CriticalTiming { get; set; } + + /// 齐射弹药数(推荐算法填充) + public int SalvoRounds { get; set; } + /// 云团间隔(m)(推荐算法填充) + public double SalvoSpacing { get; set; } } } diff --git a/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs b/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs index 7bddc70..617742b 100644 --- a/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs +++ b/src/Unity/Assets/Scripts/Managers/SimulationRunner.cs @@ -186,18 +186,16 @@ namespace CounterDrone.Unity var cloud = detail.Cloud; if (!cloud.RecommendedTiming.HasValue || cloud.RecommendedTiming <= 0) return schedule; - // 每个发射平台打一发,目标云团位置(平台已由推荐算法部署到最佳位置) - var platforms = detail.Equipment.FindAll(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform); - if (platforms.Count == 0) return schedule; - - var releaseAlt = (float)cloud.DisperseHeight; - if (releaseAlt < 10) releaseAlt = 300f; + // 齐射展开 + var spacing = (float)cloud.SalvoSpacing; + if (spacing <= 0) spacing = 50f; for (int i = 0; i < platforms.Count; i++) { var p = platforms[i]; var mv = (float)(p.MuzzleVelocity ?? 800); - var tx = (float)cloud.PositionX; var ty = (float)cloud.PositionY; var tz = (float)cloud.PositionZ; + var offset = (i - (platforms.Count - 1) / 2f) * spacing; + var tx = (float)cloud.PositionX + offset; var ty = (float)cloud.PositionY; var tz = (float)cloud.PositionZ; var dx = tx - (float)p.PositionX; var dz = tz - (float)p.PositionZ; var dist = Mathf.Sqrt(dx * dx + dz * dz); var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt); diff --git a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs index fdbad1e..ec34143 100644 --- a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs +++ b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs @@ -84,7 +84,9 @@ namespace CounterDrone.Core.Tests .ToList(); if (platforms.Count == 0) return schedule; - // 每个部署平台打一发(平台数量由推荐算法确定) + // 齐射展开:按推荐间隔沿航路排列云团位置 + var spacing = (float)cloud.SalvoSpacing; + if (spacing <= 0) spacing = 50f; var releaseAlt = (float)cloud.DisperseHeight; if (releaseAlt < 10) releaseAlt = 300f; @@ -92,7 +94,8 @@ namespace CounterDrone.Core.Tests { var p = platforms[i]; var mv = (float)(p.MuzzleVelocity ?? 800); - var tx = (float)cloud.PositionX; var ty = (float)cloud.PositionY; var tz = (float)cloud.PositionZ; + var offset = (i - (platforms.Count - 1) / 2f) * spacing; + var tx = (float)cloud.PositionX + offset; var ty = (float)cloud.PositionY; var tz = (float)cloud.PositionZ; var dx = tx - (float)p.PositionX; var dz = tz - (float)p.PositionZ; var dist = (float)Math.Sqrt(dx * dx + dz * dz); var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt);