From 1f092e8647d6b586492e6780587d549ac3616f26 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sat, 13 Jun 2026 18:24:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=AF=86=E5=BA=A6=E9=98=88?= =?UTF-8?q?=E5=80=BC=E7=BB=9F=E4=B8=80=E5=9C=A8=E5=BC=95=E6=93=8E=E6=A3=80?= =?UTF-8?q?=E6=9F=A5(ammo.EffectiveConcentration)=EF=BC=8C=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E4=B8=89=E4=B8=AA=E6=A8=A1=E5=9E=8B=E7=9A=84=E7=A1=AC?= =?UTF-8?q?=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SimulationEngine: 密度Phase 1 爆轰初始半径 (m) public float InitialRadius => 3.3f * (float)Math.Pow(Math.Max(0.01, (float)_ammo.BurstChargeKg), 0.32f); + /// Phase 2 结束时的有效半径(30s 湍流膨胀) + public float TurbulentRadius => RadiusAt(30f); + + /// Phase 2 边界时间 + public float Phase2Duration => 30f; + /// 湍流膨胀系数 k public float TurbulentExpansionK => (float)_ammo.TurbulentExpansionK; /// 指定时刻湍流膨胀半径 R(t) = R₀ + k√t @@ -64,7 +70,7 @@ namespace CounterDrone.Core.Algorithms /// 覆盖指定距离需要的云团数量(间距=2R) public int RoundsNeeded(float requiredCoverage) { - float R = RadiusAt(30f); + float R = TurbulentRadius; float spacing = 2f * R; return Math.Max(1, (int)Math.Ceiling(requiredCoverage / spacing)); } diff --git a/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs b/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs index 4dc898a..4d1dfa1 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultAmmunition.cs @@ -33,7 +33,7 @@ namespace CounterDrone.Core.Algorithms InitialRadius = 5.0, CoreDensity = 2.0, EdgeDensity = 0.2, InitialTemperature = 2400, BuoyancyFactor = 0.6, - EffectiveConcentration = 0.0002, + EffectiveConcentration = 0.0001, MaxRadius = 80.0, MaxDuration = 90.0, SourceStrength = 12.0, BurstChargeKg = 4.0, TurbulentExpansionK = 4.0, diff --git a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs index cfcdcff..85c5653 100644 --- a/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs +++ b/src/CounterDrone.Core/Algorithms/DefaultDefensePlanner.cs @@ -396,7 +396,12 @@ namespace CounterDrone.Core.Algorithms var mid = ThreatMidpoint(threat); var cloudModel = new CloudExpansionModel(ammo, env); - float expansionTime = cloudModel.TimeToReach(cloudModel.RadiusAt(30f)); + float expansionTime = cloudModel.TimeToReach(cloudModel.TurbulentRadius); + + // 密度检查:云团在膨胀时间后密度是否仍达标 + float densityAtPassage = cloudModel.DensityAt(expansionTime); + if (densityAtPassage < (float)ammo.EffectiveConcentration) + return events; // 云团到达时已稀释失效 // 编队 Y 偏移:按车道分布 float laneSpacingZ = yLanes > 1 ? formationWidth / (yLanes - 1) : 0f; diff --git a/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs b/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs index 8a32095..860fadb 100644 --- a/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs +++ b/src/CounterDrone.Core/Algorithms/InertGasDamageModel.cs @@ -13,9 +13,6 @@ namespace CounterDrone.Core.Algorithms AerosolType aerosolType, float cloudDensity, float exposureTime, float deltaTime) { if (aerosolType != AerosolType.InertGas) return 0f; - if (cloudDensity < EffectiveThreshold) return 0f; - - // 活塞发动机对惰性气体最敏感 var sensitivity = powerType == PowerType.Piston ? 1.5f : 1.0f; return DamageRate * sensitivity * deltaTime; } diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index 045aee9..157b657 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -253,7 +253,7 @@ namespace CounterDrone.Core.Simulation var dist = (float)System.Math.Sqrt(dx * dx + dy * dy + dz * dz); bool inside = dist <= cloud.Dispersion.EffectiveRadius; _hitLog.AppendLine($"{drone.PosX:F1},{drone.PosY:F1},{cloud.Dispersion.Center.X:F1},{cloud.Dispersion.Center.Y:F1},{dist:F1},{cloud.Dispersion.EffectiveRadius:F1},{inside}"); - if (inside) + if (inside && cloud.Dispersion.CoreDensity >= (float)_ammoSpec.EffectiveConcentration) { drone.ExposureTime += scaledDt; var dmg = _damageModel.CalculateDamage(drone.TargetType, drone.PowerType, cloud.AerosolType, cloud.Dispersion.CoreDensity, drone.ExposureTime, scaledDt);