From 182af5026db0b65fc81f6694df0ff5cce6ba150c Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sat, 13 Jun 2026 11:54:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20recommendedTiming=E6=8C=89=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E7=82=B9=E4=BD=8D=E7=BD=AE=E7=AE=97=E8=80=8C=E9=9D=9E?= =?UTF-8?q?=E4=B8=AD=E7=82=B9=E2=80=94=E2=80=94=E6=AF=8F=E4=B8=AA=E5=BC=B9?= =?UTF-8?q?=E9=81=93=E5=88=B0=E8=BE=BE=E6=97=B6=E9=97=B4=E4=B8=8D=E5=90=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GenerateFireEventsAt: txArrival = distToTx/droneSpeed 替代 threat.ArrivalTime - 航路反方向截断保护 - 暴露毁伤时间 34.4s→38.4s --- .../Algorithms/DefaultDefensePlanner.cs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) 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) {