diff --git a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs index 18d6267..ea7a334 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs @@ -411,12 +411,23 @@ namespace CounterDrone.Core.Algorithms var mid = ThreatMidpoint(threat); var (effectiveR, expansionTime) = ComputeEffectiveRadius(threat, ammo, env); - float recommendedTiming = threat.ArrivalTime - expansionTime; - if (recommendedTiming < 0.1f) recommendedTiming = 0.1f; - float tx = mid.X + targetOffset; float tz = mid.Z; + // 按目标点位置计算无人机到达时间,非中点 + float droneSpeed = (float)threat.Target.TypicalSpeed / 3.6f; + 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); + 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 recommendedTiming = txArrival - expansionTime; + if (recommendedTiming < 0.1f) recommendedTiming = 0.1f; + float fireTime; if (unit.Type == PlatformType.AirBased) {