CloudDispersal加SalvoRounds/Spacing, FireSchedule按间隔展开云团, 拦截成功
This commit is contained in:
parent
a35fd4b545
commit
98e16ea720
@ -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,
|
||||||
|
|||||||
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user