refactor: 删除Planner所有配置默认值——参数必须从FireUnit取,取不到报错
- 删除 CruiseSpeed=55/MuzzleVelocity=800/ReleaseAltitude=+500 等8处默认值 - 空基参数<=0抛 InvalidOperationException,地基初速<=0跳过候选 - 无人机速度/航路长度为0跳过该弹 - 保留物理安全守卫(防NaN/除零)和概率帽0.95
This commit is contained in:
parent
182af5026d
commit
162338ce83
@ -137,7 +137,7 @@ namespace CounterDrone.Core.Algorithms
|
||||
float cloudDiameter = effectiveR * 2f;
|
||||
float droneSpeed = (float)threat.Target.TypicalSpeed / 3.6f;
|
||||
float physicsInterval = Math.Max(candidates[0].Unit.ChannelInterval,
|
||||
cloudDiameter / Math.Max(0.1f, droneSpeed));
|
||||
cloudDiameter / droneSpeed);
|
||||
float spacing = effectiveR * 1.5f;
|
||||
|
||||
foreach (var c in candidates.OrderBy(c => c.EarliestInterceptTime)
|
||||
@ -263,6 +263,7 @@ namespace CounterDrone.Core.Algorithms
|
||||
float dz = mid.Z - unit.Position.Z;
|
||||
float dist = (float)Math.Sqrt(dx * dx + dz * dz);
|
||||
|
||||
if (unit.MuzzleVelocity <= 0) return null;
|
||||
float maxRange = unit.MuzzleVelocity * unit.MuzzleVelocity / 9.81f;
|
||||
if (dist > maxRange * 0.8f) return null;
|
||||
|
||||
@ -290,13 +291,13 @@ namespace CounterDrone.Core.Algorithms
|
||||
FireUnit unit, AerosolType ammoType, AmmunitionSpec ammo,
|
||||
(float radius, float expTime) ammoEff, CombatScene env)
|
||||
{
|
||||
if (unit.ReleaseAltitude <= 0 || unit.CruiseSpeed <= 0) return null;
|
||||
var mid = ThreatMidpoint(threat);
|
||||
float releaseAlt = unit.ReleaseAltitude > 0 ? unit.ReleaseAltitude : (float)threat.Target.TypicalAltitude + 500f;
|
||||
float releaseAlt = unit.ReleaseAltitude;
|
||||
float flightDist = Kinematics.Distance3D(
|
||||
unit.Position.X, unit.Position.Y, unit.Position.Z,
|
||||
mid.X, releaseAlt, mid.Z);
|
||||
float cruiseSpd = unit.CruiseSpeed > 0.1f ? unit.CruiseSpeed : 55f;
|
||||
float flightTime = flightDist / cruiseSpd;
|
||||
float flightTime = flightDist / unit.CruiseSpeed;
|
||||
float fallTime = Kinematics.AirDropFallTime(releaseAlt, (float)threat.Target.TypicalAltitude);
|
||||
float totalTime = flightTime + fallTime;
|
||||
|
||||
@ -416,40 +417,47 @@ namespace CounterDrone.Core.Algorithms
|
||||
|
||||
// 按目标点位置计算无人机到达时间,非中点
|
||||
float droneSpeed = (float)threat.Target.TypicalSpeed / 3.6f;
|
||||
if (droneSpeed <= 0) return events;
|
||||
float startX = (float)threat.Waypoints[0].PosX;
|
||||
float startZ = (float)threat.Waypoints[0].PosZ;
|
||||
float endX = (float)threat.Waypoints[^1].PosX;
|
||||
float endZ = (float)threat.Waypoints[^1].PosZ;
|
||||
float totalDist = Kinematics.Distance2D(startX, startZ, endX, endZ);
|
||||
if (totalDist <= 0) return events;
|
||||
float distToTx = Kinematics.Distance2D(startX, startZ, tx, tz);
|
||||
// 如果目标点在航路反向,截断到 [0, totalDist]
|
||||
distToTx = Math.Max(0, Math.Min(totalDist, distToTx));
|
||||
float txArrival = totalDist > 0.1f ? distToTx / Math.Max(0.1f, droneSpeed) : 0;
|
||||
float txArrival = distToTx / droneSpeed;
|
||||
float recommendedTiming = txArrival - expansionTime;
|
||||
if (recommendedTiming < 0.1f) recommendedTiming = 0.1f;
|
||||
// 来不及:无人机到达时云团未形成 → 跳过此目标点
|
||||
if (recommendedTiming <= 0f) return events;
|
||||
|
||||
float fireTime;
|
||||
if (unit.Type == PlatformType.AirBased)
|
||||
{
|
||||
float releaseAlt = unit.ReleaseAltitude > 0 ? unit.ReleaseAltitude : (float)threat.Target.TypicalAltitude + 500f;
|
||||
if (unit.ReleaseAltitude <= 0 || unit.CruiseSpeed <= 0)
|
||||
throw new InvalidOperationException($"空基单元 {unit.Id}: ReleaseAltitude={unit.ReleaseAltitude}, CruiseSpeed={unit.CruiseSpeed} 必须>0");
|
||||
float releaseAlt = unit.ReleaseAltitude;
|
||||
float cruiseSpd = unit.CruiseSpeed;
|
||||
float flightDist = Kinematics.Distance3D(
|
||||
unit.Position.X, unit.Position.Y, unit.Position.Z,
|
||||
tx, releaseAlt, tz);
|
||||
float cruiseSpd = unit.CruiseSpeed > 0.1f ? unit.CruiseSpeed : 55f;
|
||||
float flightTime = flightDist / cruiseSpd;
|
||||
float fallTime = Kinematics.AirDropFallTime(releaseAlt, (float)threat.Target.TypicalAltitude);
|
||||
fireTime = recommendedTiming - flightTime - fallTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (unit.MuzzleVelocity <= 0)
|
||||
throw new InvalidOperationException($"地基单元 {unit.Id}: MuzzleVelocity={unit.MuzzleVelocity} 必须>0");
|
||||
float mv = unit.MuzzleVelocity;
|
||||
float dx = tx - unit.Position.X;
|
||||
float dz = tz - unit.Position.Z;
|
||||
float dist = (float)Math.Sqrt(dx * dx + dz * dz);
|
||||
float shellTime = dist / (unit.MuzzleVelocity > 0.1f ? unit.MuzzleVelocity : 800f);
|
||||
float shellTime = dist / mv;
|
||||
fireTime = recommendedTiming - shellTime;
|
||||
}
|
||||
|
||||
if (fireTime < 0.1f) fireTime = 0.1f;
|
||||
if (fireTime <= 0f) return events; // 平台来不及到达
|
||||
|
||||
events.Add(new FireEvent
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user