From c7c21c0684fd84c43c1da40678852de5e0de0be3 Mon Sep 17 00:00:00 2001 From: 2weiEmu Date: Tue, 3 Feb 2026 16:19:06 +0100 Subject: [PATCH] updated: jank missile script --- .../__pycache__/calc.cpython-314.pyc | Bin 0 -> 10705 bytes Nebulous Command/missile-simulator.py | 112 ++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 Nebulous Command/__pycache__/calc.cpython-314.pyc create mode 100644 Nebulous Command/missile-simulator.py diff --git a/Nebulous Command/__pycache__/calc.cpython-314.pyc b/Nebulous Command/__pycache__/calc.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9687afa6b809b969ac1485841ce316c53fa57f59 GIT binary patch literal 10705 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 literal 0 HcmV?d00001 diff --git a/Nebulous Command/missile-simulator.py b/Nebulous Command/missile-simulator.py new file mode 100644 index 0000000..581462b --- /dev/null +++ b/Nebulous Command/missile-simulator.py @@ -0,0 +1,112 @@ +from calc import ships, jammers, radars, select_ship, select_jammer, select_radar +import cv2 as cv +import numpy as np +import math + +HEIGHT = 540 +WIDTH = 960 + +def calculate_return_power_density( + radiated_power, gain, rcs, aperture_size, distance) -> float: + numerator = radiated_power * (gain ** 2) * (rcs / 10) * aperture_size + denominator = 16 * (math.pi ** 2) * (distance ** 4) + return numerator / denominator + + +def calculate_noise(gain, noise_filtering, total_jamming_power) -> float: + return ((10 ** -7) + (total_jamming_power * gain)) * (10 ** (noise_filtering / 10)) + + +def calculate_signal_loss(return_power_density) -> float: + return 10 * math.log10(return_power_density * 1000) + + +def main(): + img = np.zeros((HEIGHT, WIDTH, 3), np.uint8) + cv.imshow("Canvas", img) + + # for now we only do tracking with EO sensor, I don't want to model the + # other sensors right now + # first we need to setup the scenario + # i.e. what kind of radar, what kind of mods does the radar have? + # is the radar tracking or targeting? + r = select_radar() + sign_scrambl = int(input("How many signature scramblers does the ship have?")) + adap_rad_recv = int(input("How many adaptive radar receivers does the ship have?")) + + # what is the missile? Side on and front on detection ranges + # what kinda mods does the missile have + # at what ranges will it be detected by the ship + s = select_ship() + j1 = select_jammer() + j2 = select_jammer() + + + radar_coating_layers = int(input("How many layers of radar coating do you have?")) + + first_definite_detect_distance = 0 + first_detect_distance_rpd = 0 + first_detect_distance_sensitivity = 0 + + # we assume the missile starts at 15000m and we will just move it by + # 5m every time. + # (yes, it's fine my computer will compute jsut fine im sure), but + # we go the other way just for easier saving + for d in range(5, 15000, 5): + rcs = s.rcs_m2 + if (radar_coating_layers == 1): + rcs = s.rcs_m2 * 0.6 + if (radar_coating_layers == 2): + rcs = s.rcs_m2 * 0.4528 + rpd = calculate_return_power_density(r.radiated_power_kw, r.gain_db, rcs, r.aperture_size_m2, d) + # return power density of the missile from the radar + + sensitivity = (r.sensitivity_dBm) * (1 - (sign_scrambl * 0.1)) + noise_filtering = r.noise_filtering_dB + (adap_rad_recv * -0.7) + + total_jamming_power = (j1.radiated_power_kw * j1.gain_db) / (4 * math.pi * (d ** 2)) + total_jamming_power += 0.876 * (j2.radiated_power_kw * j2.gain_db) / (4 * math.pi * (d ** 2)) + n = calculate_noise(r.gain_db, noise_filtering, total_jamming_power) # how much noise is coming from the jammers + + s_l = calculate_signal_loss(rpd) + + # first the noise check + if (rpd > n): + first_detect_distance_rpd = d + + # then the sensitivty check + if (sensitivity < s_l): + first_detect_distance_sensitivity = d + + # if both pass, then, save this as new distance + if (rpd > n and sensitivity < s_l): + first_definite_detect_distance = d + + # display the visual, frame by frame / step by step simulation + print("Distance of Definite detection:", first_definite_detect_distance) + print("Distance of Sensitivity detection:", first_detect_distance_sensitivity) + print("Distance of RPD detection:", first_detect_distance_rpd) + + c_center = (0, int(HEIGHT / 2)) + cv.circle(img, c_center, radius=2, color=(255, 0, 0), thickness=2) + + rad = int(first_definite_detect_distance * 0.064) + cv.circle(img, c_center, radius=rad, color=(0, 255, 0), thickness=5) + cv.putText(img, "Detected", (rad, int(HEIGHT / 2) + 50), cv.FONT_HERSHEY_PLAIN, 1.5, (200, 200, 200), 2) + + cv.line(img, c_center, (rad, int(HEIGHT / 2)), color=(128, 128, 0), thickness=2) + cv.putText(img, f"{first_definite_detect_distance}m", (int(rad / 2), int(HEIGHT / 2) - 50), cv.FONT_HERSHEY_PLAIN, 1.5, (200, 200, 200), 2) + + rad = int(first_detect_distance_sensitivity * 0.064) + cv.circle(img, c_center, radius=rad, color=(128, 128, 0), thickness=5) + + rad = int(first_detect_distance_rpd * 0.064) + cv.circle(img, c_center, radius=rad, color=(0, 0, 255), thickness=5) + + cv.imshow("Canvas", img) + cv.waitKey(0) + cv.destroyAllWindows() + + +if __name__ == "__main__": + main() -- 2.54.0