CloudDispersal加SalvoRounds/Spacing, FireSchedule按间隔展开云团, 拦截成功

This commit is contained in:
tian 2026-06-12 11:32:17 +08:00
parent a35fd4b545
commit 98e16ea720
4 changed files with 30 additions and 30 deletions

View File

@ -105,16 +105,10 @@ namespace CounterDrone.Core.Algorithms
var expansionTime = (float)Math.Pow((effectiveR - r0) / k, 2); var expansionTime = (float)Math.Pow((effectiveR - r0) / k, 2);
var recommendedTiming = halfTime - expansionTime; var recommendedTiming = halfTime - expansionTime;
var cloudSalvo = new List<CloudDispersal>(); var bestCloud = new CloudDispersal
for (int i = 0; i < roundsNeeded; i++)
{
var offset = (i - (roundsNeeded - 1) / 2f) * spacing;
cloudSalvo.Add(new CloudDispersal
{ {
AerosolType = (int)aerosolType, AerosolType = (int)aerosolType,
PositionX = mid.X + offset, PositionX = mid.X, PositionY = mid.Y, PositionZ = mid.Z,
PositionY = mid.Y,
PositionZ = mid.Z,
DisperseHeight = (float)target.TypicalAltitude, DisperseHeight = (float)target.TypicalAltitude,
TriggerMode = (int)TriggerMode.Time, TriggerMode = (int)TriggerMode.Time,
Duration = (int)maxDur, Duration = (int)maxDur,
@ -123,8 +117,9 @@ namespace CounterDrone.Core.Algorithms
Source = "Algorithm", Source = "Algorithm",
PositionMode = (int)PositionMode.AlgorithmRecommended, PositionMode = (int)PositionMode.AlgorithmRecommended,
RecommendedTiming = recommendedTiming, RecommendedTiming = recommendedTiming,
}); SalvoRounds = roundsNeeded,
} SalvoSpacing = spacing,
};
// 平台部署:假设齐射(同时发射),每门炮打一发后冷却 5s // 平台部署:假设齐射(同时发射),每门炮打一发后冷却 5s
// 需要 roundsNeeded 门炮同时发射 // 需要 roundsNeeded 门炮同时发射
@ -146,8 +141,7 @@ namespace CounterDrone.Core.Algorithms
{ {
RecommendedAerosolType = aerosolType, RecommendedAerosolType = aerosolType,
AerosolRationale = rationale, AerosolRationale = rationale,
RecommendedCloud = cloudSalvo[0], RecommendedCloud = bestCloud,
CloudSalvo = cloudSalvo,
SalvoRounds = roundsNeeded, SalvoRounds = roundsNeeded,
SalvoSpacing = spacing, SalvoSpacing = spacing,
Platforms = platforms, Platforms = platforms,

View File

@ -45,5 +45,10 @@ namespace CounterDrone.Core.Models
public double? CriticalPosY { get; set; } public double? CriticalPosY { get; set; }
public double? CriticalPosZ { get; set; } public double? CriticalPosZ { get; set; }
public double? CriticalTiming { get; set; } public double? CriticalTiming { get; set; }
/// <summary>齐射弹药数(推荐算法填充)</summary>
public int SalvoRounds { get; set; }
/// <summary>云团间隔m推荐算法填充</summary>
public double SalvoSpacing { get; set; }
} }
} }

View File

@ -186,18 +186,16 @@ namespace CounterDrone.Unity
var cloud = detail.Cloud; var cloud = detail.Cloud;
if (!cloud.RecommendedTiming.HasValue || cloud.RecommendedTiming <= 0) return schedule; if (!cloud.RecommendedTiming.HasValue || cloud.RecommendedTiming <= 0) return schedule;
// 每个发射平台打一发,目标云团位置(平台已由推荐算法部署到最佳位置) // 齐射展开
var platforms = detail.Equipment.FindAll(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform); var spacing = (float)cloud.SalvoSpacing;
if (platforms.Count == 0) return schedule; if (spacing <= 0) spacing = 50f;
var releaseAlt = (float)cloud.DisperseHeight;
if (releaseAlt < 10) releaseAlt = 300f;
for (int i = 0; i < platforms.Count; i++) for (int i = 0; i < platforms.Count; i++)
{ {
var p = platforms[i]; var p = platforms[i];
var mv = (float)(p.MuzzleVelocity ?? 800); 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 dx = tx - (float)p.PositionX; var dz = tz - (float)p.PositionZ;
var dist = Mathf.Sqrt(dx * dx + dz * dz); var dist = Mathf.Sqrt(dx * dx + dz * dz);
var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt); var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt);

View File

@ -84,7 +84,9 @@ namespace CounterDrone.Core.Tests
.ToList(); .ToList();
if (platforms.Count == 0) return schedule; if (platforms.Count == 0) return schedule;
// 每个部署平台打一发(平台数量由推荐算法确定) // 齐射展开:按推荐间隔沿航路排列云团位置
var spacing = (float)cloud.SalvoSpacing;
if (spacing <= 0) spacing = 50f;
var releaseAlt = (float)cloud.DisperseHeight; var releaseAlt = (float)cloud.DisperseHeight;
if (releaseAlt < 10) releaseAlt = 300f; if (releaseAlt < 10) releaseAlt = 300f;
@ -92,7 +94,8 @@ namespace CounterDrone.Core.Tests
{ {
var p = platforms[i]; var p = platforms[i];
var mv = (float)(p.MuzzleVelocity ?? 800); 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 dx = tx - (float)p.PositionX; var dz = tz - (float)p.PositionZ;
var dist = (float)Math.Sqrt(dx * dx + dz * dz); var dist = (float)Math.Sqrt(dx * dx + dz * dz);
var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt); var angle = Kinematics.CalculateLaunchAngle(dist, mv, releaseAlt);