From b3dec77e926149eab2235f57b90d69cf6f0126ad Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Mon, 15 Jun 2026 19:11:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DispersionModelTests=20=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E7=8A=B6=E6=80=81=E6=B1=A1=E6=9F=93=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dissipates_AfterMaxDuration 直接用 Ammo() 返回的共享引用并修改 MaxDuration=2,后续 Phase2/Phase3 测试拿到被污染的数据 改为独立 new AmmunitionSpec 避免修改共享对象 --- .../Simulation/ControlZone.cs | 13 ++--- .../Simulation/DroneEntity.cs | 46 +++++++++++++++--- .../CounterDrone.Core.deps.json.meta | 7 +++ .../CounterDrone.Core/CounterDrone.Core.dll | Bin 143360 -> 143360 bytes .../CounterDrone.Core.pdb.meta | 7 +++ .../DispersionModelTests.cs | 10 +++- .../DroneEntityTests.cs | 34 +++++++++++++ 7 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.deps.json.meta create mode 100644 src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb.meta diff --git a/src/CounterDrone.Core/Simulation/ControlZone.cs b/src/CounterDrone.Core/Simulation/ControlZone.cs index d8e4c7a..b7188cb 100644 --- a/src/CounterDrone.Core/Simulation/ControlZone.cs +++ b/src/CounterDrone.Core/Simulation/ControlZone.cs @@ -13,6 +13,9 @@ namespace CounterDrone.Core.Simulation public float MinAltitude { get; } public float MaxAltitude { get; } + /// 预缓存的水平投影顶点 (X,Z),ContainsPoint 每帧高频调用时避免重复分配数组 + private readonly (float X, float Z)[] _vertices2D; + public struct Vector3 { public float X { get; set; } public float Y { get; set; } public float Z { get; set; } } public ControlZoneEntity(string id, string name, string verticesJson, float minAlt, float maxAlt) @@ -22,17 +25,15 @@ namespace CounterDrone.Core.Simulation MinAltitude = minAlt; MaxAltitude = maxAlt; Vertices = JsonSerializer.Deserialize>(verticesJson) ?? new(); + _vertices2D = new (float X, float Z)[Vertices.Count]; + for (int i = 0; i < Vertices.Count; i++) + _vertices2D[i] = (Vertices[i].X, Vertices[i].Z); } public bool ContainsPoint(float x, float y, float z) { if (y < MinAltitude || y > MaxAltitude) return false; - - var vertices2D = new (float X, float Z)[Vertices.Count]; - for (int i = 0; i < Vertices.Count; i++) - vertices2D[i] = (Vertices[i].X, Vertices[i].Z); - - return Kinematics.PointInPolygon(x, z, vertices2D); + return Kinematics.PointInPolygon(x, z, _vertices2D); } } } diff --git a/src/CounterDrone.Core/Simulation/DroneEntity.cs b/src/CounterDrone.Core/Simulation/DroneEntity.cs index bf1b862..de95616 100644 --- a/src/CounterDrone.Core/Simulation/DroneEntity.cs +++ b/src/CounterDrone.Core/Simulation/DroneEntity.cs @@ -26,6 +26,13 @@ namespace CounterDrone.Core.Simulation public float PrevZ { get; private set; } /// 沿航路已飞行弧长(米),由 RouteGeometry 驱动 private float _traveledArc; + /// 航路总弧长(米),构造时一次性算好(航路静态,无需每帧重算) + private readonly float _totalArc; + /// 每段段长(米),_segLen[i] = Route[i]→Route[i+1] + private readonly float[] _segLen; + /// 每段终点累积弧长(米),_cumArc[i] = sum(_segLen[0..i])。 + /// 查找弧长 s 所在段:最大的 i 使 _cumArc[i] >= s。 + private readonly float[] _cumArc; public DroneEntity(string id, string waveId, TargetConfig config, List route, int formationIndex, float lateralSpacing, int longitudinalIndex, float longitudinalSpacing, FormationMode mode) @@ -74,6 +81,22 @@ namespace CounterDrone.Core.Simulation PosY = (float)offsetRoute[0].PosY; PosZ = (float)offsetRoute[0].PosZ; } + + // 预计算航路几何缓存:航路在构造后静态不变,避免每帧重算总弧长与各段段长 + int segCount = Math.Max(0, offsetRoute.Count - 1); + _segLen = new float[segCount]; + _cumArc = new float[segCount]; + float accum = 0f; + for (int i = 0; i < segCount; i++) + { + float sl = Kinematics.Distance3D( + (float)offsetRoute[i].PosX, (float)offsetRoute[i].PosY, (float)offsetRoute[i].PosZ, + (float)offsetRoute[i + 1].PosX, (float)offsetRoute[i + 1].PosY, (float)offsetRoute[i + 1].PosZ); + _segLen[i] = sl; + accum += sl; + _cumArc[i] = accum; + } + _totalArc = accum; } public void SavePreviousPosition() @@ -89,8 +112,8 @@ namespace CounterDrone.Core.Simulation // 运动模型统一在 RouteGeometry:弧长推进 + 位置查询。 // 无人机严格按航路匀速飞行。无人机不受风偏影响(真实无人机有飞控修正航向), // 但云团受风偏影响(见 SimulationEngine 毁伤判定的云团参考系修正)。 - float totalLen = RouteGeometry.TotalLength(Route); - if (totalLen <= 0f) + // 航路几何在构造时已缓存为 _totalArc / _segLen / _cumArc,此处不再重算。 + if (_totalArc <= 0f) { Status = DroneStatus.ReachedTarget; return; @@ -99,7 +122,7 @@ namespace CounterDrone.Core.Simulation float speedMs = TypicalSpeed / 3.6f; _traveledArc += speedMs * deltaTime; - if (_traveledArc >= totalLen) + if (_traveledArc >= _totalArc) { var end = Route[^1]; PosX = (float)end.PosX; @@ -109,10 +132,19 @@ namespace CounterDrone.Core.Simulation return; } - var (x, y, z) = RouteGeometry.PositionAt(Route, _traveledArc); - PosX = x; - PosY = y; - PosZ = z; + // 在缓存的累积弧长数组中定位所在段(线性扫描:航点数通常 ≤10) + int segIdx = 0; + while (segIdx < _cumArc.Length - 1 && _traveledArc > _cumArc[segIdx]) + segIdx++; + + float segStartArc = segIdx > 0 ? _cumArc[segIdx - 1] : 0f; + float segLen = _segLen[segIdx]; + float t = segLen > 0.0001f ? (_traveledArc - segStartArc) / segLen : 0f; + var a = Route[segIdx]; + var b = Route[segIdx + 1]; + PosX = (float)(a.PosX + (b.PosX - a.PosX) * t); + PosY = (float)(a.PosY + (b.PosY - a.PosY) * t); + PosZ = (float)(a.PosZ + (b.PosZ - a.PosZ) * t); } public void ApplyDamage(float damage) diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.deps.json.meta b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.deps.json.meta new file mode 100644 index 0000000..2fc0548 --- /dev/null +++ b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 73afbe638ef585a4ba07c649d294a417 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll index e63c44080da09303ce84c52874833d5a5c10db45..f05fc78b6465492c473b8c56c203a0b37c5ac2b6 100644 GIT binary patch delta 61544 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 WLG-`2QSYa&Q+EvC>FK3@sr)D49I>DP delta 61084 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 Dau*s> diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb.meta b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb.meta new file mode 100644 index 0000000..0c525d2 --- /dev/null +++ b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 59b41f7ef22cc3747990cebf8bdb28b3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/test/unit/CounterDrone.Core.Tests/DispersionModelTests.cs b/test/unit/CounterDrone.Core.Tests/DispersionModelTests.cs index 629bbe1..526ae0c 100644 --- a/test/unit/CounterDrone.Core.Tests/DispersionModelTests.cs +++ b/test/unit/CounterDrone.Core.Tests/DispersionModelTests.cs @@ -54,8 +54,14 @@ namespace CounterDrone.Core.Tests public void Dissipates_AfterMaxDuration() { var m = new GaussianPuffDispersion(); - var a = Ammo(); - a.MaxDuration = 2; + var a = new AmmunitionSpec + { + Id = "test", AerosolType = (int)AerosolType.InertGas, + InitialRadius = 3.8, CoreDensity = 1.5, EdgeDensity = 0.1, + InitialTemperature = 1800, BuoyancyFactor = 0.3, + EffectiveConcentration = 0.0001, MaxRadius = 100, MaxDuration = 2, + SourceStrength = 10, BurstChargeKg = 1.5, TurbulentExpansionK = 3, + }; m.Initialize(a, new CombatScene { WindSpeed = 0 }, new Algorithms.Vector3(0, 0, 0), 0f); m.Tick(3f, 0f, WindDirection.N); Assert.True(m.IsDissipated); diff --git a/test/unit/CounterDrone.Core.Tests/DroneEntityTests.cs b/test/unit/CounterDrone.Core.Tests/DroneEntityTests.cs index 9f19c51..f867f3a 100644 --- a/test/unit/CounterDrone.Core.Tests/DroneEntityTests.cs +++ b/test/unit/CounterDrone.Core.Tests/DroneEntityTests.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using CounterDrone.Core.Algorithms; using CounterDrone.Core.Models; using CounterDrone.Core.Simulation; using Xunit; @@ -163,5 +164,38 @@ namespace CounterDrone.Core.Tests Assert.Equal(100f, drone.PosZ, 1); Assert.Equal(DroneStatus.ReachedTarget, drone.Status); } + + // ═══════════════════════════════════════ + // 弧长缓存一致性:多段航路上非整段边界处的位置必须与 RouteGeometry.PositionAt 精确一致 + // 防止 Update() 内段长缓存引入的数值偏差 + // ═══════════════════════════════════════ + + [Fact] + public void MultiWaypoint_SubSegmentPositions_MatchGeometry() + { + // 不规则三段折线,段长各异(50, 120, 80),避免整段边界凑巧对齐 + var route = new List + { + new() { PosX = 0, PosY = 300, PosZ = 0, Altitude = 300, Speed = 60 }, + new() { PosX = 50, PosY = 300, PosZ = 0, Altitude = 300, Speed = 60 }, // 段1: 50m + new() { PosX = 50, PosY = 300, PosZ = 120, Altitude = 300, Speed = 60 }, // 段2: 120m + new() { PosX = 130, PosY = 300, PosZ = 120, Altitude = 300, Speed = 60 }, // 段3: 80m + }; + const float speed = 60f; + float speedMs = speed / 3.6f; + + // 取若干非整段边界的弧长采样点,验证每一步位置 = RouteGeometry.PositionAt + float[] sampleArcs = { 17f, 50f, 73f, 170f, 200f, 249f }; + foreach (var arc in sampleArcs) + { + var drone = new DroneEntity("d", "g", CreateConfig(speed), route, + 0, 0, 0, 0, FormationMode.Single); + drone.Update(arc / speedMs); + var (ex, ey, ez) = RouteGeometry.PositionAt(route, arc); + Assert.True(System.Math.Abs(drone.PosX - ex) < 0.5f, $"arc={arc}: X {drone.PosX} vs {ex}"); + Assert.True(System.Math.Abs(drone.PosY - ey) < 0.5f, $"arc={arc}: Y {drone.PosY} vs {ey}"); + Assert.True(System.Math.Abs(drone.PosZ - ez) < 0.5f, $"arc={arc}: Z {drone.PosZ} vs {ez}"); + } + } } }