perf: 毁伤判定加快速排斥 (距离>2R跳过PathInSphere)
密度检查提前到外层循环,减少不必要计算
This commit is contained in:
parent
9964d77751
commit
2a87b77085
@ -275,22 +275,28 @@ namespace CounterDrone.Core.Simulation
|
||||
}
|
||||
}
|
||||
|
||||
// 6. 毁伤判定:积分路径段在云内的时间
|
||||
// 6. 毁伤判定:积分路径段在云内的时间(快速排斥:先检查包围盒)
|
||||
var (wvx, wvy, wvz) = Kinematics.WindToVector((WindDirection)_scene.WindDirection, (float)_scene.WindSpeed);
|
||||
float cloudDx = wvx * scaledDt, cloudDy = wvy * scaledDt, cloudDz = wvz * scaledDt;
|
||||
float effectiveConcentration = (float)_ammoSpec.EffectiveConcentration;
|
||||
for (int di = 0; di < _flyingDrones.Count; di++)
|
||||
{
|
||||
var drone = _flyingDrones[di];
|
||||
for (int ci = 0; ci < _clouds.Count; ci++)
|
||||
{
|
||||
var cloud = _clouds[ci];
|
||||
if (cloud.Dispersion.CoreDensity < effectiveConcentration) continue;
|
||||
// 快速排斥:检查无人机与云团中心的距离是否在 2×有效半径内
|
||||
float effR = cloud.Dispersion.EffectiveRadius;
|
||||
float ccx = cloud.Dispersion.Center.X, ccy = cloud.Dispersion.Center.Y, ccz = cloud.Dispersion.Center.Z;
|
||||
float dx = drone.PosX - ccx, dy = drone.PosY - ccy, dz = drone.PosZ - ccz;
|
||||
float distSq = dx * dx + dy * dy + dz * dz;
|
||||
if (distSq > effR * effR * 4) continue; // 距离 > 2R,不可能穿云
|
||||
float inCloudDistance = DamageAssessment.PathInSphere(
|
||||
drone.PrevX - (ccx - cloudDx), drone.PrevY - (ccy - cloudDy), drone.PrevZ - (ccz - cloudDz),
|
||||
drone.PosX - ccx, drone.PosY - ccy, drone.PosZ - ccz,
|
||||
0f, 0f, 0f,
|
||||
cloud.Dispersion.EffectiveRadius);
|
||||
if (inCloudDistance > 0 && cloud.Dispersion.CoreDensity >= (float)_ammoSpec.EffectiveConcentration)
|
||||
0f, 0f, 0f, effR);
|
||||
if (inCloudDistance > 0)
|
||||
{
|
||||
float exposureIncrement = inCloudDistance / (drone.TypicalSpeed / 3.6f);
|
||||
drone.ExposureTime += exposureIncrement;
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user