diff --git a/ThreatSource.Tests/data/indicators/ir_trackers/ir_001.json b/ThreatSource.Tests/data/indicators/ir_trackers/ir_001.json
deleted file mode 100644
index 779c49e..0000000
--- a/ThreatSource.Tests/data/indicators/ir_trackers/ir_001.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "name": {
- "zh": "红外测角仪-001",
- "en": "IR Tracker-001"
- },
- "type": "InfraredTracker",
- "infraredTrackerConfig": {
- "maxTrackingRange": 10000.0,
- "fieldOfView": 0.2,
- "angleMeasurementAccuracy": 0.001,
- "updateFrequency": 10.0
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/indicators/laser_beamriders/br_001.json b/ThreatSource.Tests/data/indicators/laser_beamriders/br_001.json
deleted file mode 100644
index b19de60..0000000
--- a/ThreatSource.Tests/data/indicators/laser_beamriders/br_001.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": {
- "zh": "激光驾束仪-001",
- "en": "Laser Beam Rider-001"
- },
- "type": "LaserBeamRider",
- "beamRiderConfig": {
- "laserPower": 1000,
- "laserWavelength": 1.06,
- "controlFieldDiameter": 6.0,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1010
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/indicators/laser_designators/ld_001.json b/ThreatSource.Tests/data/indicators/laser_designators/ld_001.json
deleted file mode 100644
index 6c1c1b8..0000000
--- a/ThreatSource.Tests/data/indicators/laser_designators/ld_001.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": {
- "zh": "前视激光指示器-001",
- "en": "Forward Looking Laser Designator-001"
- },
- "type": "LaserDesignator",
- "designatorConfig": {
- "laserPower": 5000,
- "laserWavelength": 1.06,
- "laserDivergenceAngle": 0.0003,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1010
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/jammers/decoy_jammers/laser_decoy.json b/ThreatSource.Tests/data/jammers/decoy_jammers/laser_decoy.json
deleted file mode 100644
index 9dad44c..0000000
--- a/ThreatSource.Tests/data/jammers/decoy_jammers/laser_decoy.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "name": {
- "zh": "激光诱偏目标",
- "en": "Laser Decoy"
- },
- "type": "LaserDecoy",
- "LaserDecoyConfig": {
- "decoyPower": 25.0,
- "decoyLaserDivergenceAngle": 0.001,
- "reflectiveArea": 1.2,
- "reflectionCoefficient": 0.8,
- "lifeTime": 60.0
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/jammers/smoke_grenades/surround.json b/ThreatSource.Tests/data/jammers/smoke_grenades/surround.json
deleted file mode 100644
index af6a9ed..0000000
--- a/ThreatSource.Tests/data/jammers/smoke_grenades/surround.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": {
- "zh": "周边烟幕弹",
- "en": "Surround Smoke Grenade"
- },
- "type": "SmokeGrenade",
- "SmokeGrenadeConfig": {
- "smokeType": "Wall",
- "concentration": 0.2,
- "duration": 60.0,
- "wallWidth": 50.0,
- "wallHeight": 10.0,
- "cloudDiameter": 0.0,
- "thickness": 5.0,
- "formationDelay": 1.5,
- "expansionRate": 5.0
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/jammers/smoke_grenades/top.json b/ThreatSource.Tests/data/jammers/smoke_grenades/top.json
deleted file mode 100644
index 7abc495..0000000
--- a/ThreatSource.Tests/data/jammers/smoke_grenades/top.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "name": {
- "zh": "顶部烟幕弹",
- "en": "Top Smoke Grenade"
- },
- "type": "SmokeGrenade",
- "SmokeGrenadeConfig": {
- "smokeType": "Cloud",
- "concentration": 0.2,
- "duration": 60.0,
- "wallWidth": 0.0,
- "wallHeight": 0.0,
- "cloudDiameter": 20.0,
- "thickness": 5.0,
- "formationDelay": 1.5,
- "expansionRate": 5.0
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/ir_command/irc_001.json b/ThreatSource.Tests/data/missiles/ir_command/irc_001.json
deleted file mode 100644
index a6eaf72..0000000
--- a/ThreatSource.Tests/data/missiles/ir_command/irc_001.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "name": {
- "zh": "红外指令导引导弹-001",
- "en": "IR Command Guided Missile-001"
- },
- "type": "InfraredCommandGuidance",
- "properties": {
- "maxSpeed": 300.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 5000.0,
- "maxAcceleration": 100.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 5.0,
- "mass": 23.5,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 0.0,
- "trackerSensitivity": null,
- "commandLatency": null,
- "irSignature": null
- },
- "infraredCommandGuidanceConfig": {
- "jammingResistanceThreshold": 1e-3
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/ir_imaging/itg_001.json b/ThreatSource.Tests/data/missiles/ir_imaging/itg_001.json
deleted file mode 100644
index ee48218..0000000
--- a/ThreatSource.Tests/data/missiles/ir_imaging/itg_001.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": {
- "zh": "红外成像末制导导弹-001",
- "en": "IR Imaging Terminal Guided Missile-001"
- },
- "type": "InfraredImagingTerminalGuidance",
- "properties": {
- "maxSpeed": 250.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 5000.0,
- "maxAcceleration": 100.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 5.0,
- "mass": 25.0,
- "explosionRadius": 5.5,
- "hitProbability": 0.9,
- "selfDestructHeight": 0.0
- },
- "infraredImagingGuidanceConfig": {
- "maxDetectionRange": 1000,
- "searchFieldOfView": 0.209,
- "trackFieldOfView": 0.052,
- "imageWidth": 640,
- "imageHeight": 512,
- "backgroundIntensity": 0.01,
- "searchRecognitionProbability": 0.6,
- "trackRecognitionProbability": 0.8,
- "targetLostTolerance": 0.2,
- "lockConfirmationTime": 0.3,
- "jammingResistanceThreshold": 1e-3
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/laser_beam_rider/hj10.json b/ThreatSource.Tests/data/missiles/laser_beam_rider/hj10.json
deleted file mode 100644
index b47d6c6..0000000
--- a/ThreatSource.Tests/data/missiles/laser_beam_rider/hj10.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": {
- "zh": "红箭-10",
- "en": "HJ-10"
- },
- "type": "LaserBeamRiderGuidance",
- "properties": {
- "maxSpeed": 300.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 5000.0,
- "maxAcceleration": 100.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 5.0,
- "mass": 24.5,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 0.0,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1010
- },
- "IsCodeEnabled": true,
- "IsCodeMatchRequired": true
- }
- },
- "LaserBeamRiderGuidanceConfig": {
- "minDetectablePower": 1e-10,
- "detectorDiameter": 0.03,
- "controlFieldDiameter": 20.0,
- "proportionalGain": 30.0,
- "integralGain": 0.05,
- "derivativeGain": 5.0,
- "nonlinearGain": 0.5,
- "maxGuidanceAcceleration": 50.0,
- "lowPassFilterCoefficient": 0.2,
- "jammingResistanceThreshold": 1e-3
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/laser_beam_rider/kornet.json b/ThreatSource.Tests/data/missiles/laser_beam_rider/kornet.json
deleted file mode 100644
index 2ff9740..0000000
--- a/ThreatSource.Tests/data/missiles/laser_beam_rider/kornet.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "name": {
- "zh": "科尔内特",
- "en": "Kornet"
- },
- "type": "LaserBeamRiderGuidance",
- "properties": {
- "maxSpeed": 300.0,
- "maxFlightTime": 70.0,
- "maxFlightDistance": 5500.0,
- "maxAcceleration": 110.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 12.0,
- "cruiseTime": 5.0,
- "mass": 27.0,
- "explosionRadius": 5.5,
- "hitProbability": 0.9,
- "selfDestructHeight": 10.0,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1100
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/laser_beam_rider/tow.json b/ThreatSource.Tests/data/missiles/laser_beam_rider/tow.json
deleted file mode 100644
index 3c4f39f..0000000
--- a/ThreatSource.Tests/data/missiles/laser_beam_rider/tow.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "name": {
- "zh": "陶式导弹",
- "en": "TOW"
- },
- "type": "LaserBeamRiderGuidance",
- "properties": {
- "maxSpeed": 278.0,
- "maxFlightTime": 65.0,
- "maxFlightDistance": 4500.0,
- "maxAcceleration": 100.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 10.0,
- "cruiseTime": 5.0,
- "mass": 22.6,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 10.0,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1110
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/laser_semi_active/lsgm_001.json b/ThreatSource.Tests/data/missiles/laser_semi_active/lsgm_001.json
deleted file mode 100644
index 2c85ffb..0000000
--- a/ThreatSource.Tests/data/missiles/laser_semi_active/lsgm_001.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "name": {
- "zh": "激光半主动制导导弹-001",
- "en": "Laser Semi-Active Guidance Missile-001"
- },
- "type": "LaserSemiActiveGuidance",
- "properties": {
- "maxSpeed": 800.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 4000.0,
- "maxAcceleration": 50.0,
- "proportionalNavigationCoefficient": 2.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 5.0,
- "mass": 22.0,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 0.0,
- "laserCodeConfig": {
- "code": {
- "codeType": "PRF",
- "codeValue": 1010
- },
- "IsCodeEnabled": true,
- "IsCodeMatchRequired": true
- }
- },
- "laserSemiActiveGuidanceConfig": {
- "fieldOfViewAngle": 30.0,
- "lensDiameter": 0.1,
- "sensorDiameter": 0.03,
- "focusedSpotDiameter": 0.006,
- "reflectionCoefficient": 0.2,
- "targetReflectiveArea": 1.0,
- "lockThreshold": 1e-12,
- "spotOffsetSensitivity": 0.05,
- "jammingResistanceThreshold": 1e-3,
- "transmitterEfficiency": 0.85,
- "receiverEfficiency": 0.8,
- "laserWavelength": 1.06
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/mmw/mmw_001.json b/ThreatSource.Tests/data/missiles/mmw/mmw_001.json
deleted file mode 100644
index 799b230..0000000
--- a/ThreatSource.Tests/data/missiles/mmw/mmw_001.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
- "name": {
- "zh": "毫米波末制导导弹-001",
- "en": "Millimeter Wave Terminal Guided Missile-001"
- },
- "type": "MillimeterWaveTerminalGuidance",
- "properties": {
- "maxSpeed": 250.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 8000.0,
- "maxAcceleration": 100.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 4.0,
- "mass": 28.0,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 0.0
- },
- "millimeterWaveGuidanceConfig": {
- "maxDetectionRange": 5000.0,
- "fieldOfViewAngle": 45.0,
- "targetRecognitionProbability": 0.95,
- "waveFrequency": 94e9,
- "pulseDuration": 1e-6,
-
- "searchBeamWidth": 4.0,
- "trackBeamWidth": 2.0,
- "lockBeamWidth": 1.0,
-
- "scanAngularSpeedDeg": 360.0,
- "scanRadiusGrowthRateDeg": 22.5,
-
- "recognitionSNRThreshold": -25.0,
- "lockSNRThreshold": -10.0,
-
- "targetLostTolerance": 0.2,
- "lockConfirmationTime": 0.3,
-
- "pulseRepetitionFrequency": 1e-4,
- "transmitPower": 0.3,
-
- "dopplerVelocityResolution": 1.0,
- "maxMeasurableVelocity": 1000.0,
-
- "antennaGainDB": 23.0,
- "noiseFigureDB": 7.0,
- "systemLossDB": 6.0,
- "monopulseSensitivity": 1,
-
- "yawControlEffectiveness": 120.0,
- "pitchControlEffectiveness": 150.0,
- "jammingResistanceThreshold": 1e-3
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/missiles/terminal_sensitive/tsm_001.json b/ThreatSource.Tests/data/missiles/terminal_sensitive/tsm_001.json
deleted file mode 100644
index 0de6168..0000000
--- a/ThreatSource.Tests/data/missiles/terminal_sensitive/tsm_001.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "name": {
- "zh": "末敏导弹-001",
- "en": "Terminal Sensitive Missile-001"
- },
- "type": "TerminalSensitiveMissile",
- "properties": {
- "maxSpeed": 1000.0,
- "maxFlightTime": 100.0,
- "maxFlightDistance": 5000.0,
- "maxAcceleration": 200.0,
- "proportionalNavigationCoefficient": 3.0,
- "launchAcceleration": 100.0,
- "maxEngineBurnTime": 0.1,
- "cruiseTime": 5.0,
- "mass": 50.0,
- "explosionRadius": 5.0,
- "selfDestructHeight": 0.0
- },
- "submunitionProperties": {
- "maxSpeed": 2000.0,
- "maxFlightTime": 60.0,
- "maxFlightDistance": 2000.0,
- "maxAcceleration": 300.0,
- "proportionalNavigationCoefficient": 4.0,
- "launchAcceleration": 10.0,
- "maxEngineBurnTime": 0.1,
- "mass": 10.0,
- "explosionRadius": 5.0,
- "hitProbability": 0.9,
- "selfDestructHeight": 20.0
- },
- "submunitionCount": 1,
- "submunitionConfig": {
- "separationHeight": 1000.0,
- "separationDistance": 1000.0,
- "submunitionSeparationAngle": 45.0,
- "separationRange": 50.0,
- "decelerationAcceleration": 250.0,
- "decelerationEndSpeed": 50.0,
- "parachuteDeploymentHeight": 400.0,
- "parachuteDeceleration": 140.0,
- "stableScanHeight": 200.0,
- "verticalDeclineSpeed": 10.0,
- "spiralRotationSpeed": 25.13,
- "scanAngle": 30.0,
- "targetDetectionDistance": 150.0,
- "selfDestructHeight": 20.0,
- "attackSpeed": 200.0
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/sensors/laser_warners/lw_001.json b/ThreatSource.Tests/data/sensors/laser_warners/lw_001.json
deleted file mode 100644
index 7bdd997..0000000
--- a/ThreatSource.Tests/data/sensors/laser_warners/lw_001.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "name": {
- "zh": "激光告警接收机-001",
- "en": "Laser Warning Receiver-001"
- },
- "type": "LaserWarner",
- "properties": {
- "detectionRange": 5000.0,
- "wavelengthRange": {
- "min": 0.4,
- "max": 1.7
- },
- "fieldOfView": 360.0,
- "responseTime": 0.001,
- "sensitivity": -60.0,
- "angularResolution": 7.5,
- "falseAlarmRate": 1e-6,
- "detectionProbability": 0.95,
- "spectralBands": [
- {
- "name": "Band1",
- "minWavelength": 0.4,
- "maxWavelength": 0.7
- },
- {
- "name": "Band2",
- "minWavelength": 0.7,
- "maxWavelength": 1.7
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/targets/apcs/apc_001.json b/ThreatSource.Tests/data/targets/apcs/apc_001.json
deleted file mode 100644
index 506011b..0000000
--- a/ThreatSource.Tests/data/targets/apcs/apc_001.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": {
- "zh": "装甲运兵车-001",
- "en": "Armored Personnel Carrier-001"
- },
- "type": "APC",
- "mass": 25000.0,
- "length": 7.0,
- "width": 3.2,
- "height": 2.8,
- "maxSpeed": 80.0,
- "armorThickness": 400.0,
-
- "radarCrossSection": 12.0,
- "infraredRadiationIntensity": 2000.0,
- "ultravioletRadiationIntensity": 12.0,
- "millimeterWaveRadiationIntensity": 8.0,
- "millimeterWaveRadiationTemperature": 350.0,
- "laserReflectivity": 0.25,
-
- "thermalPattern": {
- "description": "3x3 matrix representing side view temperature distribution (°C)",
- "static": [
- [35, 40, 65],
- [30, 35, 70],
- [40, 40, 45]
- ],
- "moving": [
- [40, 45, 70],
- [35, 40, 75],
- [50, 50, 55]
- ]
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/targets/helicopters/heli_001.json b/ThreatSource.Tests/data/targets/helicopters/heli_001.json
deleted file mode 100644
index c3c6b97..0000000
--- a/ThreatSource.Tests/data/targets/helicopters/heli_001.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": {
- "zh": "武装直升机-001",
- "en": "Attack Helicopter-001"
- },
- "type": "Helicopter",
- "mass": 10000.0,
- "length": 17.0,
- "width": 3.0,
- "height": 4.5,
- "maxSpeed": 280.0,
- "armorThickness": 150.0,
-
- "radarCrossSection": 8.0,
- "infraredRadiationIntensity": 3000.0,
- "ultravioletRadiationIntensity": 20.0,
- "millimeterWaveRadiationIntensity": 6.0,
- "millimeterWaveRadiationTemperature": 450.0,
- "laserReflectivity": 0.2,
-
- "thermalPattern": {
- "description": "3x3 matrix representing side view temperature distribution (°C)",
- "static": [
- [85, 110, 80],
- [35, 45, 40],
- [30, 35, 30]
- ],
- "moving": [
- [90, 115, 85],
- [40, 50, 45],
- [35, 40, 35]
- ]
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/targets/tanks/mbt_001.json b/ThreatSource.Tests/data/targets/tanks/mbt_001.json
deleted file mode 100644
index 979429b..0000000
--- a/ThreatSource.Tests/data/targets/tanks/mbt_001.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": {
- "zh": "主战坦克-001",
- "en": "Main Battle Tank-001"
- },
- "type": "Tank",
- "properties": {
- "mass": 50000.0,
- "length": 10.0,
- "width": 3.5,
- "height": 2.4,
- "maxSpeed": 70.0,
- "armorThickness": 800.0,
- "radarCrossSection": 15.0,
- "infraredRadiationIntensity": 2500.0,
- "ultravioletRadiationIntensity": 15.0,
- "millimeterWaveRadiationIntensity": 10.0,
- "millimeterWaveRadiationTemperature": 400.0,
- "laserReflectivity": 0.3,
- "thermalPattern": {
- "description": "3x3 matrix representing side view temperature distribution (°C)",
- "static": [
- [40, 45, 80],
- [35, 40, 90],
- [50, 50, 60]
- ],
- "moving": [
- [45, 50, 85],
- [40, 45, 95],
- [65, 65, 75]
- ]
- }
- }
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/heavy_fog.json b/ThreatSource.Tests/data/weathers/heavy_fog.json
deleted file mode 100644
index ca03b1e..0000000
--- a/ThreatSource.Tests/data/weathers/heavy_fog.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "浓雾",
- "en": "Heavy Fog"
- },
- "type": "Fog",
- "temperature": 8.0,
- "relativeHumidity": 99.0,
- "visibility": 0.1,
- "precipitation": 0.0,
- "cO2Concentration": 415.0,
- "pressure": 998.0,
- "windSpeed": 0.0,
- "windDirection": 0.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/heavy_rain.json b/ThreatSource.Tests/data/weathers/heavy_rain.json
deleted file mode 100644
index f7c99e2..0000000
--- a/ThreatSource.Tests/data/weathers/heavy_rain.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "大雨",
- "en": "Heavy Rain"
- },
- "type": "Rain",
- "temperature": 16.0,
- "relativeHumidity": 95.0,
- "visibility": 2.0,
- "precipitation": 25.0,
- "cO2Concentration": 415.0,
- "pressure": 985.0,
- "windSpeed": 8.0,
- "windDirection": 180.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/heavy_snow.json b/ThreatSource.Tests/data/weathers/heavy_snow.json
deleted file mode 100644
index 3a929d1..0000000
--- a/ThreatSource.Tests/data/weathers/heavy_snow.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "大雪",
- "en": "Heavy Snow"
- },
- "type": "Snow",
- "temperature": -7.0,
- "relativeHumidity": 85.0,
- "visibility": 1.0,
- "precipitation": 8.0,
- "cO2Concentration": 410.0,
- "pressure": 990.0,
- "windSpeed": 6.0,
- "windDirection": 270.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/light_fog.json b/ThreatSource.Tests/data/weathers/light_fog.json
deleted file mode 100644
index 693e6f5..0000000
--- a/ThreatSource.Tests/data/weathers/light_fog.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "轻雾",
- "en": "Light Fog"
- },
- "type": "Fog",
- "temperature": 12.0,
- "relativeHumidity": 95.0,
- "visibility": 0.8,
- "precipitation": 0.0,
- "cO2Concentration": 415.0,
- "pressure": 1000.0,
- "windSpeed": 0.5,
- "windDirection": 20.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/light_rain.json b/ThreatSource.Tests/data/weathers/light_rain.json
deleted file mode 100644
index 38bcfb5..0000000
--- a/ThreatSource.Tests/data/weathers/light_rain.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "小雨",
- "en": "Light Rain"
- },
- "type": "Rain",
- "temperature": 20.0,
- "relativeHumidity": 80.0,
- "visibility": 6.0,
- "precipitation": 5.0,
- "cO2Concentration": 415.0,
- "pressure": 1005.0,
- "windSpeed": 3.0,
- "windDirection": 180.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/light_snow.json b/ThreatSource.Tests/data/weathers/light_snow.json
deleted file mode 100644
index bb656e0..0000000
--- a/ThreatSource.Tests/data/weathers/light_snow.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "小雪",
- "en": "Light Snow"
- },
- "type": "Snow",
- "temperature": -3.0,
- "relativeHumidity": 75.0,
- "visibility": 4.0,
- "precipitation": 2.0,
- "cO2Concentration": 410.0,
- "pressure": 1002.0,
- "windSpeed": 3.0,
- "windDirection": 270.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/medium_fog.json b/ThreatSource.Tests/data/weathers/medium_fog.json
deleted file mode 100644
index 5236375..0000000
--- a/ThreatSource.Tests/data/weathers/medium_fog.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "中雾",
- "en": "Medium Fog"
- },
- "type": "Fog",
- "temperature": 10.0,
- "relativeHumidity": 98.0,
- "visibility": 0.4,
- "precipitation": 0.0,
- "cO2Concentration": 415.0,
- "pressure": 1000.0,
- "windSpeed": 0.2,
- "windDirection": 10.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/medium_rain.json b/ThreatSource.Tests/data/weathers/medium_rain.json
deleted file mode 100644
index 4fe1d6f..0000000
--- a/ThreatSource.Tests/data/weathers/medium_rain.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "中雨",
- "en": "Medium Rain"
- },
- "type": "Rain",
- "temperature": 18.0,
- "relativeHumidity": 90.0,
- "visibility": 4.0,
- "precipitation": 15.0,
- "cO2Concentration": 415.0,
- "pressure": 995.0,
- "windSpeed": 6.0,
- "windDirection": 180.0
-}
diff --git a/ThreatSource.Tests/data/weathers/medium_snow.json b/ThreatSource.Tests/data/weathers/medium_snow.json
deleted file mode 100644
index 1b43fe4..0000000
--- a/ThreatSource.Tests/data/weathers/medium_snow.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "中雪",
- "en": "Medium Snow"
- },
- "type": "Snow",
- "temperature": -5.0,
- "relativeHumidity": 80.0,
- "visibility": 2.0,
- "precipitation": 4.0,
- "cO2Concentration": 410.0,
- "pressure": 1000.0,
- "windSpeed": 4.0,
- "windDirection": 270.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/sandstorm.json b/ThreatSource.Tests/data/weathers/sandstorm.json
deleted file mode 100644
index 992bec2..0000000
--- a/ThreatSource.Tests/data/weathers/sandstorm.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "沙尘",
- "en": "Sandstorm"
- },
- "type": "Dust",
- "temperature": 30.0,
- "relativeHumidity": 25.0,
- "visibility": 1.5,
- "precipitation": 0.0,
- "cO2Concentration": 430.0,
- "pressure": 1005.0,
- "windSpeed": 12.0,
- "windDirection": 315.0
-}
\ No newline at end of file
diff --git a/ThreatSource.Tests/data/weathers/sunny.json b/ThreatSource.Tests/data/weathers/sunny.json
deleted file mode 100644
index 6dbbffa..0000000
--- a/ThreatSource.Tests/data/weathers/sunny.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": {
- "zh": "晴天",
- "en": "Sunny"
- },
- "type": "Clear",
- "temperature": 25.0,
- "relativeHumidity": 45.0,
- "visibility": 15.0,
- "precipitation": 0.0,
- "cO2Concentration": 415.0,
- "pressure": 1018.0,
- "windSpeed": 1.2,
- "windDirection": 90.0
-}
\ No newline at end of file
diff --git a/ThreatSource/data/missiles/laser_semi_active/lsgm_001.json b/ThreatSource/data/missiles/laser_semi_active/lsgm_001.json
index 2c85ffb..5e9a303 100644
--- a/ThreatSource/data/missiles/laser_semi_active/lsgm_001.json
+++ b/ThreatSource/data/missiles/laser_semi_active/lsgm_001.json
@@ -33,7 +33,7 @@
"focusedSpotDiameter": 0.006,
"reflectionCoefficient": 0.2,
"targetReflectiveArea": 1.0,
- "lockThreshold": 1e-12,
+ "lockThreshold": 1e-10,
"spotOffsetSensitivity": 0.05,
"jammingResistanceThreshold": 1e-3,
"transmitterEfficiency": 0.85,
diff --git a/ThreatSource/src/Data/ThreatSourceDataManager.cs b/ThreatSource/src/Data/ThreatSourceDataManager.cs
index 69be0a1..fc218a5 100644
--- a/ThreatSource/src/Data/ThreatSourceDataManager.cs
+++ b/ThreatSource/src/Data/ThreatSourceDataManager.cs
@@ -15,7 +15,10 @@ namespace ThreatSource.Data
///
public class ThreatSourceDataManager
{
- private static readonly string DATA_PATH = "../ThreatSource/data";
+ ///
+ /// 默认数据目录路径
+ ///
+ private static readonly string DATA_PATH = "../data";
private static readonly JsonSerializerOptions _jsonOptions = new()
{
PropertyNameCaseInsensitive = true,
@@ -25,12 +28,12 @@ namespace ThreatSource.Data
new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)
}
};
- private readonly Dictionary _missiles = new();
- private readonly Dictionary _indicators = new();
- private readonly Dictionary _sensors = new();
- private readonly Dictionary _targets = new();
- private readonly Dictionary _weathers = new();
- private readonly Dictionary _jammers = new();
+ private readonly Dictionary _missiles = [];
+ private readonly Dictionary _indicators = [];
+ private readonly Dictionary _sensors = [];
+ private readonly Dictionary _targets = [];
+ private readonly Dictionary _weathers = [];
+ private readonly Dictionary _jammers = [];
///
/// 初始化威胁源数据管理器
///
diff --git a/ThreatSource/src/Guidance/BasicGuidanceSystem.cs b/ThreatSource/src/Guidance/BasicGuidanceSystem.cs
index d63a6f7..40f6d63 100644
--- a/ThreatSource/src/Guidance/BasicGuidanceSystem.cs
+++ b/ThreatSource/src/Guidance/BasicGuidanceSystem.cs
@@ -36,6 +36,11 @@ namespace ThreatSource.Guidance
///
public bool IsJammed => _jammingComponent.IsJammed;
+ ///
+ /// 设置或获取设备当前是否处于硬干扰状态
+ ///
+ protected bool IsHardJammed { get; private set; } = false;
+
///
/// 获取或设置父实体ID
///
@@ -233,10 +238,13 @@ namespace ThreatSource.Guidance
protected virtual void HandleJammingApplied(JammingParameters parameters)
{
// 子类可以重写此方法以实现特定的干扰响应
- Console.WriteLine($"导引系统受到{parameters.Type}类型干扰,功率:{parameters.Power}W");
-
- // 干扰应用后,设置无有效制导
- HasGuidance = false;
+ // 默认:非烟幕干扰是硬干扰
+ if (parameters.Type != JammingType.SmokeScreen)
+ {
+ this.IsHardJammed = true;
+ this.HasGuidance = false; // 硬干扰立即停止制导
+ Trace.WriteLine($"[{this.GetType().Name}] 硬干扰已应用: {parameters.Type}");
+ }
}
///
@@ -246,12 +254,27 @@ namespace ThreatSource.Guidance
protected virtual void HandleJammingCleared(JammingType type)
{
// 子类可以重写此方法以实现干扰清除后的特定行为
- Console.WriteLine($"导引系统{type}类型干扰已清除");
-
- // 干扰清除后恢复制导状态
- // 注意:实际制导能力需要根据当前情况确定,此处默认为恢复
- HasGuidance = true;
+ if (type != JammingType.SmokeScreen)
+ {
+ // 尝试清除硬干扰标志。如果还有其他硬干扰,组件状态可能仍反映,
+ // 或者后续 ApplyJamming 会再次设置 IsHardJammed。
+ // 简化处理:清除任何硬干扰时都清除标志。
+ this.IsHardJammed = false;
+ Trace.WriteLine($"[{this.GetType().Name}] 硬干扰已清除: {type}");
+ }
+ // 子类需要重写此方法来处理 SmokeScreen 清除。
+
+ // 检查整体干扰状态
+ if (!this._jammingComponent.IsJammed)
+ {
+ this.IsHardJammed = false; // 确保清除
+ this.HasGuidance = true; // 恢复制导
+ Trace.WriteLine($"[{this.GetType().Name}] 所有干扰已清除。");
+ }
+ // 如果 _jammingComponent 仍然 IsJammed (因为可能有烟幕),
+ // HasGuidance 的最终状态由 Update 决定。
}
+
///
/// 初始化干扰阈值和支持的干扰类型
///
diff --git a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs
index 6926a01..433e5e9 100644
--- a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs
+++ b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs
@@ -112,6 +112,11 @@ namespace ThreatSource.Guidance
///
private const double AccelerationSmoothingFactor = 0.5;
+ ///
+ /// 烟幕衰减
+ ///
+ private double SmokeAttenuation { get; set; } = 1.0;
+
///
/// 激光目标列表,包括真实目标和诱偏目标
///
@@ -311,14 +316,14 @@ namespace ThreatSource.Guidance
// 使用JammableComponent进行干扰判断
ApplyJamming(parameters);
- // 如果被干扰,切换到搜索模式
- if (IsJammed)
+ // 如果被硬干扰,切换到搜索模式
+ if (IsHardJammed)
{
// 清除目标信息
TargetPosition = Vector3D.Zero;
LaserIlluminationOn = false;
// 记录干扰信息
- Trace.WriteLine($"激光半主动制导系统被干扰 - 功率: {evt.JammingPower}W, 位置: {evt.JammingSourcePosition}, 方向: {evt.JammingDirection}");
+ Trace.WriteLine($"激光半主动制导系统被硬干扰 - 功率: {evt.JammingPower}W, 位置: {evt.JammingSourcePosition}, 方向: {evt.JammingDirection}");
}
}
@@ -331,15 +336,14 @@ namespace ThreatSource.Guidance
if (evt != null && evt.SmokeGrenadeId != null)
{
// 获取烟幕弹的配置
- var smokeGrenade = SimulationManager.GetEntityById(evt.SmokeGrenadeId) as SmokeGrenade;
- if (smokeGrenade != null)
+ if (SimulationManager.GetEntityById(evt.SmokeGrenadeId) is SmokeGrenade smokeGrenade)
{
var config = smokeGrenade.config;
-
// 创建干扰参数
var parameters = new JammingParameters
{
Type = JammingType.SmokeScreen,
+ JammerId = smokeGrenade.Id,
SourcePosition = smokeGrenade.Position,
Direction = smokeGrenade.Orientation.ToVector(),
AngleRange = config.SmokeType == SmokeScreenType.Wall ? Math.PI : Math.PI * 2, // 墙状烟幕为半球形覆盖,云状为全方位
@@ -352,12 +356,6 @@ namespace ThreatSource.Guidance
// 使用JammableComponent进行干扰判断
ApplyJamming(parameters);
-
- // 如果被干扰,记录信息
- if (IsJammed)
- {
- Debug.WriteLine($"激光半主动制导系统被烟幕干扰 - 浓度: {config.Concentration}g/m³, 位置: {smokeGrenade.Position}, 类型: {config.SmokeType}");
- }
}
}
}
@@ -368,48 +366,25 @@ namespace ThreatSource.Guidance
/// 干扰参数
protected override void HandleJammingApplied(JammingParameters parameters)
{
+ base.HandleJammingApplied(parameters);
+
if (parameters.Type == JammingType.Laser)
- {
- Debug.WriteLine($"激光半主动制导系统受到激光干扰,功率:{parameters.Power}瓦特");
- // 确保基类的处理逻辑被调用,设置HasGuidance = false
- base.HandleJammingApplied(parameters);
-
- // 在强干扰下切换到搜索模式
+ {
+ // 在硬干扰下切换到搜索模式
if (LaserIlluminationOn)
{
LaserIlluminationOn = false;
- HasGuidance = false;
PreviousGuidanceAcceleration = Vector3D.Zero; // 重置历史加速度
}
}
else if (parameters.Type == JammingType.SmokeScreen)
{
- Debug.WriteLine($"激光半主动制导系统受到烟幕干扰,浓度:{parameters.SmokeConcentration}g/m³");
- // 确保基类的处理逻辑被调用,设置HasGuidance = false
- base.HandleJammingApplied(parameters);
-
- // 在烟幕干扰下,降低激光功率并可能失去锁定
- if (LaserIlluminationOn)
+ if (SimulationManager.GetEntityById(parameters.JammerId) is SmokeGrenade smokeGrenade)
{
- // 烟幕会显著衰减激光功率
- double attenuationFactor = CalculateSmokeAttenuation(parameters);
- ReceivedLaserPower *= attenuationFactor;
-
- // 如果功率降低到阈值以下,失去锁定
- if (ReceivedLaserPower < config.LockThreshold)
+ // 计算烟幕衰减
+ if (LaserIlluminationOn)
{
- Debug.WriteLine($"激光半主动制导系统因烟幕干扰失去锁定,接收功率降至:{ReceivedLaserPower:E}W");
- LaserIlluminationOn = false;
- HasGuidance = false;
- PreviousGuidanceAcceleration = Vector3D.Zero; // 重置历史加速度
- }
- else
- {
- Debug.WriteLine($"激光半主动制导系统受烟幕影响,接收功率降至:{ReceivedLaserPower:E}W,但仍保持锁定");
- // 更新光斑偏移(烟幕可能导致光斑偏移)
- Vector2D spotOffset = CalculateSpotOffset();
- // 重新处理激光信号
- quadrantDetector.ProcessLaserSignal(ReceivedLaserPower, spotOffset);
+ SmokeAttenuation = smokeGrenade.GetSmokeTransmittanceOnLine(Position, TargetPosition, config.LaserWavelength);
}
}
}
@@ -421,18 +396,7 @@ namespace ThreatSource.Guidance
/// 被清除的干扰类型
protected override void HandleJammingCleared(JammingType type)
{
- if (type == JammingType.Laser)
- {
- Debug.WriteLine("激光半主动制导系统激光干扰已清除");
- // 确保基类的处理逻辑被调用
- base.HandleJammingCleared(type);
- }
- else if (type == JammingType.SmokeScreen)
- {
- Debug.WriteLine("激光半主动制导系统烟幕干扰已清除");
- // 确保基类的处理逻辑被调用
- base.HandleJammingCleared(type);
- }
+ base.HandleJammingCleared(type);
}
///
@@ -444,30 +408,21 @@ namespace ThreatSource.Guidance
public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity)
{
base.Update(deltaTime, missilePosition, missileVelocity);
+
+ // 处理接收到的所有激光信号
+ ProcessLaserTargets();
- if (!IsJammed)
- {
- // 处理接收到的所有激光信号
- ProcessLaserTargets();
+ if (LaserIlluminationOn && !IsHardJammed)
+ {
+ // 更新制导状态
+ HasGuidance = quadrantDetector.IsTargetLocked;
- if (LaserIlluminationOn)
+ if (HasGuidance)
{
- // 更新制导状态
- HasGuidance = quadrantDetector.IsTargetLocked;
-
- if (HasGuidance)
- {
- CalculateGuidanceAcceleration(deltaTime);
- }
- else
- {
- GuidanceAcceleration = Vector3D.Zero;
- PreviousGuidanceAcceleration = Vector3D.Zero; // 重置历史加速度
- }
+ CalculateGuidanceAcceleration(deltaTime);
}
else
{
- HasGuidance = false;
GuidanceAcceleration = Vector3D.Zero;
PreviousGuidanceAcceleration = Vector3D.Zero; // 重置历史加速度
}
@@ -514,7 +469,6 @@ namespace ThreatSource.Guidance
}
double receivedPower = 0;
- Console.WriteLine($"处理激光信号: 目标ID: {target.Target.Id}, 目标位置: {target.Target.Position}, 目标角度偏差: {angleDeviation:F2}弧度, 视野范围: {config.FieldOfViewAngleInRadians:F2}弧度");
if (target.Target is LaserDecoy decoy)
{
// 计算接收功率
@@ -530,11 +484,10 @@ namespace ThreatSource.Guidance
// 累加功率
ReceivedLaserPower += receivedPower;
- Console.WriteLine($"处理激光信号: 总功率={ReceivedLaserPower:E}W");
-
+
// 加权位置
weightedPosition += target.Target.Position * receivedPower;
- Console.WriteLine($"处理激光信号: 加权位置={weightedPosition}");
+ Console.WriteLine($"处理激光信号: 累加功率={ReceivedLaserPower:E}W, 加权位置={weightedPosition}");
}
// 如果总功率为0,表示没有在视野范围内的激光源
@@ -583,15 +536,16 @@ namespace ThreatSource.Guidance
double atmosphericTransmittanceToTarget = 1.0;
double atmosphericTransmittanceToMissile = 1.0;
+ // 考虑烟幕衰减,计算大气透过率
if(SimulationManager.CurrentWeather != null)
{
- atmosphericTransmittanceToTarget = AtmosphereDllWrapper.CalculateTransmittance(
+ atmosphericTransmittanceToTarget = SmokeAttenuation * AtmosphereDllWrapper.CalculateTransmittance(
distanceDesignatorToTarget,
RadiationType.Laser,
config.LaserWavelength,
SimulationManager.CurrentWeather);
- atmosphericTransmittanceToMissile = AtmosphereDllWrapper.CalculateTransmittance(
+ atmosphericTransmittanceToMissile = SmokeAttenuation * AtmosphereDllWrapper.CalculateTransmittance(
distanceMissileToTarget,
RadiationType.Laser,
config.LaserWavelength,
diff --git a/ThreatSource/src/Jammable/JammableComponent.cs b/ThreatSource/src/Jammable/JammableComponent.cs
index d7254e1..b1f1a20 100644
--- a/ThreatSource/src/Jammable/JammableComponent.cs
+++ b/ThreatSource/src/Jammable/JammableComponent.cs
@@ -94,62 +94,14 @@ namespace ThreatSource.Jammable
/// 如果干扰有效返回true,否则返回false
public bool IsJammingEffective(JammingParameters parameters)
{
+
// 检查是否支持该干扰类型
if (!_jammingThresholds.TryGetValue(parameters.Type, out double threshold))
{
return false; // 不支持的干扰类型
}
-
- // 处理烟幕干扰
- if (parameters.Type == JammingType.SmokeScreen)
- {
- if (!parameters.SmokeConcentration.HasValue) return false;
-
- // 获取设备位置
- Vector3D smokeDevicePosition = _owner._positionProvider();
-
- // 检查设备是否在烟幕范围内
- bool inSmokeRange = false;
-
- if (parameters.SmokeType == SmokeScreenType.Cloud)
- {
- // 对于云状烟幕,检查是否在半径范围内
- double distanceToSmoke = (smokeDevicePosition - parameters.SourcePosition).Magnitude();
- double smokeRadius = parameters.SmokeThickness.HasValue ? parameters.SmokeThickness.Value / 2 : 10.0;
- inSmokeRange = distanceToSmoke <= smokeRadius;
- }
- else // SmokeScreenType.Wall
- {
- // 对于墙状烟幕,需要更复杂的计算
- Vector3D smokeRelativePos = smokeDevicePosition - parameters.SourcePosition;
- Vector3D smokeWallNormal = parameters.Direction.Normalize();
-
- // 1. 检查高度范围
- if (Math.Abs(smokeRelativePos.Y) <= 5.0) // 烟幕墙高10米,上下5米
- {
- // 2. 计算到墙面的距离
- double distToSmokeWall = Math.Abs(Vector3D.DotProduct(smokeRelativePos, smokeWallNormal));
- if (distToSmokeWall <= 2.5) // 烟幕墙厚5米,前后2.5米
- {
- // 3. 计算沿墙面的距离
- Vector3D smokeWallDirection = Vector3D.CrossProduct(smokeWallNormal, Vector3D.UnitY).Normalize();
- double distAlongSmokeWall = Math.Abs(Vector3D.DotProduct(smokeRelativePos, smokeWallDirection));
- double smokeWallWidth = parameters.SmokeThickness.HasValue ? parameters.SmokeThickness.Value : 50.0;
- inSmokeRange = distAlongSmokeWall <= smokeWallWidth / 2;
- }
- }
- }
-
- if (!inSmokeRange) return false;
-
- // 现实合理的最小有效浓度为0.05 g/m³
- // 0.05 g/m³ 是能明显影响视线和激光透过率的最低浓度
- const double MIN_EFFECTIVE_CONCENTRATION = 0.05;
-
- // 考虑阈值设置,阈值表示设备对烟幕的抗性,即能够"穿透"的最大浓度
- // 阈值越高,设备越能在浓烟中工作
- return parameters.SmokeConcentration.Value >= Math.Max(MIN_EFFECTIVE_CONCENTRATION, threshold);
- }
+ // 烟幕干扰总是有效
+ if(parameters.Type == JammingType.SmokeScreen) return true;
// 处理普通干扰
// 计算干扰源与设备之间的矢量
@@ -350,6 +302,10 @@ namespace ThreatSource.Jammable
{
_jammingProcessor.HandleJamming(parameters);
}
+ else
+ {
+ Console.WriteLine($"[可干扰组件] 不支持的干扰类型: {parameters.Type}");
+ }
}
///
diff --git a/ThreatSource/src/Jammer/BaseJammer.cs b/ThreatSource/src/Jammer/BaseJammer.cs
index 0369a88..18183fa 100644
--- a/ThreatSource/src/Jammer/BaseJammer.cs
+++ b/ThreatSource/src/Jammer/BaseJammer.cs
@@ -130,6 +130,8 @@ namespace ThreatSource.Jammer
/// 时间步长,单位:秒
public override void Update(double deltaTime)
{
+ Console.WriteLine($"[干扰器] 更新干扰器状态: 干扰器ID={Id}, 是否激活={IsActive}, 是否干扰={IsJamming}, 当前参数={CurrentParameters}");
+
if (!IsActive || !IsJamming || CurrentParameters == null)
{
return;
diff --git a/ThreatSource/src/Jammer/JammingParameters.cs b/ThreatSource/src/Jammer/JammingParameters.cs
index dda9330..7895bc5 100644
--- a/ThreatSource/src/Jammer/JammingParameters.cs
+++ b/ThreatSource/src/Jammer/JammingParameters.cs
@@ -12,6 +12,11 @@ namespace ThreatSource.Jammer
///
public JammingType Type { get; set; }
+ ///
+ /// 干扰源ID
+ ///
+ public string JammerId { get; set; } = "";
+
///
/// 干扰功率,单位:瓦特
///
diff --git a/ThreatSource/src/Jammer/SmokeGrenade.cs b/ThreatSource/src/Jammer/SmokeGrenade.cs
index f35e392..c6e1f37 100644
--- a/ThreatSource/src/Jammer/SmokeGrenade.cs
+++ b/ThreatSource/src/Jammer/SmokeGrenade.cs
@@ -79,6 +79,7 @@ namespace ThreatSource.Jammer
return new JammingParameters
{
Type = JammingType.SmokeScreen,
+ JammerId = Id,
Power = 0, // 烟幕不需要功率参数
Direction = Orientation.ToVector(),
SourcePosition = Position,
@@ -143,8 +144,7 @@ namespace ThreatSource.Jammer
CurrentParameters.SmokeWallHeight = config.WallHeight + expansionAmount;
CurrentParameters.SmokeDiameter = null;
}
-
- // 发布烟幕状态更新事件
+ // 发布烟幕状态更新事件
PublishSmokeEvent();
// 检查是否需要停止烟幕效果
@@ -206,7 +206,27 @@ namespace ThreatSource.Jammer
};
PublishEvent(evt);
}
-
+
+ ///
+ /// 计算观察者到目标的视线穿过烟雾的透射率
+ ///
+ /// 观察者位置
+ /// 目标位置
+ /// 激光波长
+ /// 透射率,范围:0-1,0表示完全衰减,1表示无衰减
+ public double GetSmokeTransmittanceOnLine(Vector3D observerPosition, Vector3D targetPosition, double wavelength)
+ {
+ Console.WriteLine($"[烟幕透过率计算] 观察者位置={observerPosition}, 目标位置={targetPosition}, 波长={wavelength}");
+ if (IsActive && IsJamming && CurrentParameters != null)
+ {
+ double concentration = CurrentParameters.SmokeConcentration ?? config.Concentration;
+ double thickness = GetSmokeThicknessOnLine(observerPosition, targetPosition);
+ return AtmosphereDllWrapper.CalculateSmokeScreenTransmittance(wavelength, concentration, thickness);
+ }
+ // 如果烟幕未激活或未开启干扰,返回1表示完全透射
+ return 1;
+ }
+
///
/// 计算观察者到目标的视线穿过烟雾的厚度
///
diff --git a/ThreatSource/src/Simulation/SimulationElement.cs b/ThreatSource/src/Simulation/SimulationElement.cs
index ed8f786..840a396 100644
--- a/ThreatSource/src/Simulation/SimulationElement.cs
+++ b/ThreatSource/src/Simulation/SimulationElement.cs
@@ -111,6 +111,7 @@ namespace ThreatSource.Simulation
evt.SenderId = Id;
evt.Timestamp = DateTime.UtcNow.Ticks;
SimulationManager.PublishEvent(evt);
+ Console.WriteLine($"[仿真元素] 发布事件: 事件类型={evt.GetType().Name}, 发送者ID={evt.SenderId}, 时间戳={evt.Timestamp}");
}
///
diff --git a/docs/project/develop_log.md b/docs/project/develop_log.md
index 7946d84..b8bae43 100644
--- a/docs/project/develop_log.md
+++ b/docs/project/develop_log.md
@@ -12,6 +12,7 @@
- 增加了激光诱偏目标的干扰功能
- 把烟幕弹和激光诱偏都统一到Jammer架构中
- 修改了装备的接口,把ISpectralCharacteristics接口移除
+- 修改了威胁源数据管理器,增加了数据目录路径,在用户使用 dll 库时,要指定DataManager 的数据目录路径
## 2025-04-10 增加了 Jammer 架构,实现了烟幕弹逻辑
diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs
index 5c13a30..bc962de 100644
--- a/tools/ComprehensiveMissileSimulator.cs
+++ b/tools/ComprehensiveMissileSimulator.cs
@@ -40,7 +40,7 @@ namespace ThreatSource.Tools.MissileSimulation
public ComprehensiveMissileSimulator()
{
simulationManager = new SimulationManager();
- _dataManager = new ThreatSourceDataManager();
+ _dataManager = new ThreatSourceDataManager("../ThreatSource/data");
_threatSourceFactory = new ThreatSourceFactory(_dataManager, simulationManager);
missiles = new Dictionary();
targets = new Dictionary();
@@ -121,9 +121,12 @@ namespace ThreatSource.Tools.MissileSimulation
};
string laserDecoyId = "LDY_1";
var laserDecoy = _threatSourceFactory.CreateJammer(laserDecoyId, "laser_decoy", motionParameters, "Tank_1") as LaserDecoy;
- simulationManager.RegisterEntity(laserDecoyId, laserDecoy);
- jammers[laserDecoyId] = laserDecoy as BaseJammer;
- Console.WriteLine($"注册激光诱偏目标 {laserDecoyId}");
+ if (laserDecoy != null)
+ {
+ simulationManager.RegisterEntity(laserDecoyId, laserDecoy);
+ jammers[laserDecoyId] = laserDecoy as BaseJammer;
+ Console.WriteLine($"注册激光诱偏目标 {laserDecoyId}");
+ }
}
///
@@ -133,15 +136,18 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new MotionParameters
{
- Position = new Vector3D(100, 0, 0),
- Orientation = new Orientation(Math.PI, 0, 0),
+ Position = new Vector3D(100, 5, 0),
+ Orientation = Orientation.FromVector(Vector3D.UnitX),
InitialSpeed = 0.0
};
string smokeGrenadeId = "SG_1";
var smokeGrenade = _threatSourceFactory.CreateJammer(smokeGrenadeId, "surround", motionParameters, "Tank_1");
- simulationManager.RegisterEntity(smokeGrenadeId, smokeGrenade);
- jammers[smokeGrenadeId] = smokeGrenade as BaseJammer;
- Console.WriteLine($"注册烟幕弹 {smokeGrenadeId}");
+ if (smokeGrenade != null)
+ {
+ simulationManager.RegisterEntity(smokeGrenadeId, smokeGrenade);
+ jammers[smokeGrenadeId] = smokeGrenade as BaseJammer;
+ Console.WriteLine($"注册烟幕弹 {smokeGrenadeId}");
+ }
}
///
@@ -151,8 +157,8 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new MotionParameters
{
- Position = new Vector3D(2000, 1, 100),
- Orientation = new Orientation(Math.PI, 0.05, 0),
+ Position = new Vector3D(2000, 1, 0),
+ Orientation = new Orientation(Math.PI, 0.01, 0),
InitialSpeed = 700
};
string missileId = "LSGM_1";
@@ -359,10 +365,15 @@ namespace ThreatSource.Tools.MissileSimulation
indicators["LD_1"].Activate();
}
Console.WriteLine($"干扰器数量 {jammers.Count}");
- if (jammers.ContainsKey("LDY_1"))
+ // if (jammers.ContainsKey("LDY_1"))
+ // {
+ // jammers["LDY_1"].Activate();
+ // Console.WriteLine($"激活激光诱偏目标 {jammers["LDY_1"].Id}");
+ // }
+ if (jammers.ContainsKey("SG_1"))
{
- jammers["LDY_1"].Activate();
- Console.WriteLine($"激活激光诱偏目标 {jammers["LDY_1"].Id}");
+ jammers["SG_1"].Activate();
+ Console.WriteLine($"激活烟幕弹 {jammers["SG_1"].Id}");
}
break;
case "LBRM_1": // 激光驾束制导导弹
@@ -399,6 +410,18 @@ namespace ThreatSource.Tools.MissileSimulation
SourcePosition = position
};
+ switch (type)
+ {
+ case JammingType.SmokeScreen:
+ jammingParams.JammerId = "SG_1";
+ jammers["SG_1"].Activate();
+ break;
+ case JammingType.Decoy:
+ jammingParams.JammerId = "LDY_1";
+ jammers["LDY_1"].Activate();
+ break;
+ }
+
foreach (var missile in missiles.Values)
{
if (missile is BaseMissile actualMissile)