From c2a49f4f0005ea12a7664ea69911e1301a3a514b Mon Sep 17 00:00:00 2001 From: Dan Date: Sat, 18 May 2024 21:04:49 -0400 Subject: [PATCH 1/5] working on rocket interception --- frontend/src/pages/scenario.jsx | 87 ++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/frontend/src/pages/scenario.jsx b/frontend/src/pages/scenario.jsx index 8f95126..c111915 100644 --- a/frontend/src/pages/scenario.jsx +++ b/frontend/src/pages/scenario.jsx @@ -16,6 +16,7 @@ const CANVAS_HEIGHT = window.innerHeight; const EARTH_X = CANVAS_WIDTH - 100; const EARTH_Y = CANVAS_HEIGHT / 2; const SIMULATION_AREA_MULTIPLIER = 2; // Extend the simulation area +const ROCKET_SPEED = 0.1; // Speed of the rocket function Scenario() { const [asteroid, setAsteroid] = useState({ @@ -35,6 +36,7 @@ function Scenario() { const [simulationResult, setSimulationResult] = useState(''); const [strategy, setStrategy] = useState(''); // State for selected strategy const [timeStep, setTimeStep] = useState(100); // State for time step + const [rocket, setRocket] = useState({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], targetX: 0, targetY: 0 }); useEffect(() => { const fetchAsteroids = async () => { @@ -72,23 +74,13 @@ function Scenario() { }); setTrajectoryPoints([]); calculateForecastPath(size, speed, Math.PI / 9, mass); // Calculate the forecast path once + setRocket({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], targetX: 0, targetY: 0 }); }; const handleAsteroidSelect = (event) => { setAsteroidData(event.target.value); }; - const applyDeflectionStrategy = (vx, vy) => { - if (strategy === 'Nuclear Detonation') { - vx += 0.5; // Example effect - } else if (strategy === 'Kinetic Impact') { - vx += 0.25; // Example effect - } else if (strategy === 'Gravity Tractor') { - vy -= 0.1; // Example effect - } - return { vx, vy }; - }; - const calculateForecastPath = (size, speed, angle, mass) => { let x = 100; let y = CANVAS_HEIGHT / 2 - 100; @@ -135,6 +127,31 @@ function Scenario() { setForecastPoints(points); }; + const calculateInterceptionPoint = (rocketSpeed, asteroidX, asteroidY, asteroidVX, asteroidVY) => { + let interceptX = asteroidX; + let interceptY = asteroidY; + let closestApproach = Infinity; + + for (let t = 0; t < 5000; t += timeStep) { + const futureAsteroidX = asteroidX + asteroidVX * t; + const futureAsteroidY = asteroidY + asteroidVY * t; + + const dx = futureAsteroidX - EARTH_X; + const dy = futureAsteroidY - EARTH_Y; + const distanceToAsteroid = Math.sqrt(dx * dx + dy * dy); + + const timeToIntercept = distanceToAsteroid / rocketSpeed; + if (Math.abs(timeToIntercept - t) < closestApproach) { + closestApproach = Math.abs(timeToIntercept - t); + interceptX = futureAsteroidX; + interceptY = futureAsteroidY; + } + } + + console.log(`Calculated interception point: (${interceptX}, ${interceptY})`); + return { x: interceptX, y: interceptY }; + }; + const simulate = () => { let { x, y, speed, angle, mass } = asteroid; @@ -162,11 +179,37 @@ function Scenario() { vx += ax * timeStep; vy += ay * timeStep; - ({ vx, vy } = applyDeflectionStrategy(vx, vy)); - x += vx * timeStep; y += vy * timeStep; + // Calculate the interception point for the rocket in real-time + const { x: interceptX, y: interceptY } = calculateInterceptionPoint(ROCKET_SPEED, x, y, vx, vy); + setRocket((prev) => ({ ...prev, targetX: interceptX, targetY: interceptY })); + + console.log(`Rocket target updated to: (${interceptX}, ${interceptY})`); + + // Update rocket position + const rocketDx = rocket.targetX - rocket.x; + const rocketDy = rocket.targetY - rocket.y; + const rocketDistance = Math.sqrt(rocketDx * rocketDx + rocketDy * rocketDy); + + if (rocketDistance > 1) { + const rocketAngle = Math.atan2(rocketDy, rocketDx); + const rocketVX = ROCKET_SPEED * Math.cos(rocketAngle); + const rocketVY = ROCKET_SPEED * Math.sin(rocketAngle); + + setRocket((prev) => ({ + ...prev, + x: prev.x + rocketVX * timeStep, + y: prev.y + rocketVY * timeStep, + trajectory: [...prev.trajectory, prev.x + rocketVX * timeStep, prev.y + rocketVY * timeStep], + })); + } else { + setSimulationResult('Rocket intercepted the asteroid!'); + setIsSimulating(false); + return; + } + if (y > CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x > CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER || y < -CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x < -CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER) { setSimulationResult('Asteroid missed Earth!'); setIsSimulating(false); @@ -184,8 +227,13 @@ function Scenario() { }; const handleSimulate = () => { - if (isSimulating) return; - simulate(); + if (isSimulating) { + setIsSimulating(false); + window.cancelAnimationFrame(animationRef.current); + setSimulationResult('Simulation stopped.'); + } else { + simulate(); + } }; const handleTimeStepChange = (event, newValue) => { @@ -216,10 +264,9 @@ function Scenario() { variant="contained" color="primary" onClick={handleSimulate} - disabled={isSimulating} style={{ marginTop: '10px' }} > - Simulate + {isSimulating ? 'Stop Simulation' : 'Simulate'} {simulationResult && (
@@ -270,6 +317,12 @@ function Scenario() { {forecastPoints.length > 0 && ( )} + {rocket.active && ( + + )} + {rocket.trajectory.length > 0 && ( + + )} From aaa20177c5d042972b42e6364674fdfa4d891141 Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 19 May 2024 01:12:29 -0400 Subject: [PATCH 2/5] ugh --- frontend/src/pages/scenario.jsx | 95 +++++++++++++++------------------ 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/frontend/src/pages/scenario.jsx b/frontend/src/pages/scenario.jsx index c111915..258d3b8 100644 --- a/frontend/src/pages/scenario.jsx +++ b/frontend/src/pages/scenario.jsx @@ -16,7 +16,7 @@ const CANVAS_HEIGHT = window.innerHeight; const EARTH_X = CANVAS_WIDTH - 100; const EARTH_Y = CANVAS_HEIGHT / 2; const SIMULATION_AREA_MULTIPLIER = 2; // Extend the simulation area -const ROCKET_SPEED = 0.1; // Speed of the rocket +const ROCKET_SPEED = 0.025; // Reduced speed of the rocket function Scenario() { const [asteroid, setAsteroid] = useState({ @@ -36,7 +36,15 @@ function Scenario() { const [simulationResult, setSimulationResult] = useState(''); const [strategy, setStrategy] = useState(''); // State for selected strategy const [timeStep, setTimeStep] = useState(100); // State for time step - const [rocket, setRocket] = useState({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], targetX: 0, targetY: 0 }); + const [rocket, setRocket] = useState({ + active: false, + x: EARTH_X, + y: EARTH_Y, + trajectory: [], + vx: 0, vy: 0 + }); + const rocketDistanceRef = useRef(10000); + useEffect(() => { const fetchAsteroids = async () => { @@ -51,6 +59,8 @@ function Scenario() { fetchAsteroids(); }, []); + + const estimateMass = (diameter) => { const radius = diameter / 2; const volume = (4 / 3) * Math.PI * Math.pow(radius, 3); @@ -74,7 +84,8 @@ function Scenario() { }); setTrajectoryPoints([]); calculateForecastPath(size, speed, Math.PI / 9, mass); // Calculate the forecast path once - setRocket({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], targetX: 0, targetY: 0 }); + setRocket({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], vx: 0, vy: 0 }); + }; const handleAsteroidSelect = (event) => { @@ -127,30 +138,9 @@ function Scenario() { setForecastPoints(points); }; - const calculateInterceptionPoint = (rocketSpeed, asteroidX, asteroidY, asteroidVX, asteroidVY) => { - let interceptX = asteroidX; - let interceptY = asteroidY; - let closestApproach = Infinity; - - for (let t = 0; t < 5000; t += timeStep) { - const futureAsteroidX = asteroidX + asteroidVX * t; - const futureAsteroidY = asteroidY + asteroidVY * t; - - const dx = futureAsteroidX - EARTH_X; - const dy = futureAsteroidY - EARTH_Y; - const distanceToAsteroid = Math.sqrt(dx * dx + dy * dy); - - const timeToIntercept = distanceToAsteroid / rocketSpeed; - if (Math.abs(timeToIntercept - t) < closestApproach) { - closestApproach = Math.abs(timeToIntercept - t); - interceptX = futureAsteroidX; - interceptY = futureAsteroidY; - } - } - - console.log(`Calculated interception point: (${interceptX}, ${interceptY})`); - return { x: interceptX, y: interceptY }; - }; + // useEffect(() => { + // + // }, [rocketDistanceRef]); const simulate = () => { let { x, y, speed, angle, mass } = asteroid; @@ -159,8 +149,6 @@ function Scenario() { let vy = speed * Math.sin(angle); const updateFrame = () => { - console.log(`Asteroid position: (${x}, ${y}), velocity: (${vx}, ${vy})`); - const dx = EARTH_X - x; const dy = EARTH_Y - y; const distance = Math.sqrt(dx * dx + dy * dy); @@ -182,34 +170,39 @@ function Scenario() { x += vx * timeStep; y += vy * timeStep; - // Calculate the interception point for the rocket in real-time - const { x: interceptX, y: interceptY } = calculateInterceptionPoint(ROCKET_SPEED, x, y, vx, vy); - setRocket((prev) => ({ ...prev, targetX: interceptX, targetY: interceptY })); + rocketDistanceRef.current = 1000; - console.log(`Rocket target updated to: (${interceptX}, ${interceptY})`); + setRocket((prev) => { + // Update rocket position + const rocketDx = x - prev.x; + const rocketDy = y - prev.y; - // Update rocket position - const rocketDx = rocket.targetX - rocket.x; - const rocketDy = rocket.targetY - rocket.y; - const rocketDistance = Math.sqrt(rocketDx * rocketDx + rocketDy * rocketDy); - - if (rocketDistance > 1) { + const rocketDist = Math.sqrt(rocketDx * rocketDx + rocketDy* rocketDy); const rocketAngle = Math.atan2(rocketDy, rocketDx); const rocketVX = ROCKET_SPEED * Math.cos(rocketAngle); - const rocketVY = ROCKET_SPEED * Math.sin(rocketAngle); + const rocketVY = ROCKET_SPEED * Math.sin(rocketAngle) ; - setRocket((prev) => ({ - ...prev, - x: prev.x + rocketVX * timeStep, - y: prev.y + rocketVY * timeStep, - trajectory: [...prev.trajectory, prev.x + rocketVX * timeStep, prev.y + rocketVY * timeStep], - })); - } else { - setSimulationResult('Rocket intercepted the asteroid!'); - setIsSimulating(false); - return; - } + const newX = prev.x + rocketVX * timeStep; + const newY = prev.y + rocketVY * timeStep; + rocketDistanceRef.current=rocketDist; + const temprocket = { + x: newX, + y: newY, + vx: rocketVX, + vy: rocketVY, + trajectory: [...prev.trajectory, newX, newY], + }; + + return temprocket; + }); + + console.log('rocketDistance:', rocketDistanceRef); + if (rocketDistanceRef < asteroid.size * ASTEROID_DISPLAY_SCALE) { + setSimulationResult('Rocket intercepted the asteroid!'); + setIsSimulating(false); + return; + } if (y > CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x > CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER || y < -CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x < -CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER) { setSimulationResult('Asteroid missed Earth!'); setIsSimulating(false); From 1711936609a7b0eb8767008daaae54198702ecfc Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 19 May 2024 03:19:04 -0400 Subject: [PATCH 3/5] added ignore for pycache --- backend/deep_impact_proj/.env.sample | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 205 -> 183 bytes .../api_app/__pycache__/admin.cpython-311.pyc | Bin 260 -> 238 bytes .../api_app/__pycache__/apps.cpython-311.pyc | Bin 577 -> 555 bytes .../__pycache__/models.cpython-311.pyc | Bin 257 -> 235 bytes .../api_app/__pycache__/urls.cpython-311.pyc | Bin 574 -> 552 bytes .../api_app/__pycache__/utils.cpython-311.pyc | Bin 1470 -> 1448 bytes .../api_app/__pycache__/views.cpython-311.pyc | Bin 1509 -> 1487 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 216 -> 194 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 214 -> 192 bytes .../__pycache__/settings.cpython-311.pyc | Bin 3138 -> 3116 bytes .../__pycache__/urls.cpython-311.pyc | Bin 1215 -> 1193 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 754 -> 732 bytes frontend/src/pages/scenario.jsx | 167 +++++++++++------- 14 files changed, 101 insertions(+), 68 deletions(-) diff --git a/backend/deep_impact_proj/.env.sample b/backend/deep_impact_proj/.env.sample index cc3ccc3..8530af4 100644 --- a/backend/deep_impact_proj/.env.sample +++ b/backend/deep_impact_proj/.env.sample @@ -3,4 +3,4 @@ SENTRY_API_KEY=<"Your NASA Sentry API Key"> OPENAI_API_KEY=<"Your OpenAI API Key"> HOST_CLIENT=<"Your FrontEnd URL"> ALLOWED_HOSTS=<"Your Server URL"> -DEBUG=<"True for Deployment | False for Development"> \ No newline at end of file +DEBUG=<"True for Deployment | False for Development"> diff --git a/backend/deep_impact_proj/api_app/__pycache__/__init__.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/__init__.cpython-311.pyc index 96988ff71f38bf0c6b8560700a111b4f43c01318..a4b76cd0ac8ec337eb651ff858de8d432fe1455d 100644 GIT binary patch delta 86 zcmX@hxSf$}IWI340}ym|P2@6j@N%|_2`x@7DvohU%!_gMcX5qzNlh)#^~^0uOfHE@ kN=(j9%}a?%0gAL(Ut#wQjO=ud1g F2LQF~CUyV- diff --git a/backend/deep_impact_proj/api_app/__pycache__/admin.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/admin.cpython-311.pyc index aea8442fdadc0c70c26abb6af27a5dad74013807..c8277e49588c3c603681f68937057a2662df13bb 100644 GIT binary patch delta 89 zcmZo+ddJASoR^o20SLOfJky*e^2R&3J6pws7N-^!$G9Zs#W?%BxW>4orWWXW<`yI- nm&7C`CTFMSrNpEF#o{x;V(|q<`B^cE1)1@Q1qCq^4>XM)Az3xEps6ALoq6AKFT IC$4b<03u~4wg3PC diff --git a/backend/deep_impact_proj/api_app/__pycache__/apps.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/apps.cpython-311.pyc index 331dfe9342775916acc0358aa155b548271fbfaf..4f326809a6838103a49ad4527dcab38f73da4713 100644 GIT binary patch delta 91 zcmX@evYLf=IWI340}ym|d8SR@$Sc6;;O1-<6Iz^FR2<`ym>1*h@8TNclA2ne>zP}S pm|PN*l$e~InwJuj0u+nS1dGKN6y;~dBo<`GCl(aMOfF_T2LK<{AFcoZ delta 113 zcmZ3@a*&00IWI340}$K`@JySykyn5*EJi;gKQ~oBE59fuF|RT)H!&qq-#I@eH6SOk zBtJh-KcFZ-D>b>KSl=ZzwLsT1w;(aOL_aApIXg8kMLz{77M}?gi!T5w)K4tPj87~m K(4QR3cn$zt4orWWXW<`yI- nm&7C`CTFMSrNpEF#o{x;V(|q<`B^cE1)1@Q1qCq^_c;Rq>q8$m delta 111 zcmaFO*vQ1YoR^o20SN8|c&1rSXM)Az3xEps6ALoq6AKFT IC$4Y?033rSqyPW_ diff --git a/backend/deep_impact_proj/api_app/__pycache__/urls.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/urls.cpython-311.pyc index 0ae640f6adea968cced25167392cda285fee29d2..152c84f32c809b12655208e8faaccaa26de3f60b 100644 GIT binary patch delta 91 zcmdnTvVw(oIWI340}ym|d8VD*$ZOB&;O1-<6Iz^FR2<`ym>1*h@8TNclA2ne>zP}S pm|PN*l$e~InwJuj0u+nS1dGKN6y;~dBo<`GCl(aMOkTt|2LL&dAO-*c delta 113 zcmZ3%vX6y#IWI340}vQhd!`-O$ZO9S7Neh$pPQL(Ut#wQjO K=uhrpoC5$!!zb(j diff --git a/backend/deep_impact_proj/api_app/__pycache__/utils.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/utils.cpython-311.pyc index 11ac1dfd41a0e5ad244ac5795daa8fa01f3cf409..bce4ab9e5e75c695baea10bd1d4f87c2b93e3f1e 100644 GIT binary patch delta 92 zcmdnTy@H!}IWI340}ym|d8RGf$Scq6;O=Y{6Iz^FR2<`ym>1*h@8TNclA2ne>zP}S qm|PN*l$e~InwJuj0u+nS1dGKN6y;~dBo<`GCl(aMY;IzL(Ut#wQjO L=x@$pwqXJQU)3jH diff --git a/backend/deep_impact_proj/api_app/__pycache__/views.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/views.cpython-311.pyc index 23785c7594b1c58c245b2fae9e78f0d2fe0780af..44d1d2def8b045488a40de56d0f0b4490191095d 100644 GIT binary patch delta 92 zcmaFLeV&_lIWI340}ym|d8XNKii`CD_&rQ|O$}dVu%&SbyO-xDDcg{~q4ai9> z$G55=%1k^NM38E;I)K4viw# delta 119 zcmW;Cu?@m75Jq9rTFNNsIv4;NI&Wb8_)g#i`%aFV%s`bX*n=skm<5YhetPfWGq~3{ zx?S(IWI340}ym|P2@8340g7P2`x@7DvohU%!_gMcX5qzNlh)#^~^0uOfHE@ dN=(j9%}a?%0gAku||S#IWI340}ym|d8S43ZRGpO=^5;76%$&VT2vh4l9(6c?C;_ltlL8cr&jgFb7Zl}ZVG3+cEay7K<+cD#R4n9Kdyl F5ddTMEa3nE diff --git a/backend/deep_impact_proj/deep_impact_proj/__pycache__/urls.cpython-311.pyc b/backend/deep_impact_proj/deep_impact_proj/__pycache__/urls.cpython-311.pyc index 3a1cce68992e9f10c24f4519503be19b67e5e13f..3b3441502540674b1fe43ff250f123f0f9babb8e 100644 GIT binary patch delta 100 zcmdnbxssE2IWI340}ym|d8YYqF;b66Iz^FR2<`ym>1*h@8TNclA2ne>zP}S im|PN*l$e~InwJuj0u+nS1dGKN6y;}O3QSgKnE?QEm?LKZ delta 122 zcmZ3KQ~oBE59fuF|RT)H!&qq-#I@eH6SOk zBtJh-KcFZ-D>b>KSl=ZzwLsT1w;(aOL_aApIXg8kMLz{77M}?gi!T5w#1xn;$T9-} D`CBWk diff --git a/backend/deep_impact_proj/deep_impact_proj/__pycache__/wsgi.cpython-311.pyc b/backend/deep_impact_proj/deep_impact_proj/__pycache__/wsgi.cpython-311.pyc index 7caa192654ff434fff9d2d5a42e63cc01cad6072..39afbf7477136705e23436962e8f11ef97183eec 100644 GIT binary patch delta 100 zcmeywdWV&FIWI340}ym|d8V!0$jim#>F;b66Iz^FR2<`ym>1*h@8TNclA2ne>zP}S im|PN*l$e~InwJuj0u+nS1dGKN6y;}O3QR6zssR9gRwJGO delta 122 zcmcb^`iYfyIWI340}$K`@JySzk(Y}pK2<*>KQ~oBE59fuF|RT)H!&qq-#I@eH6SOk zBtJh-KcFZ-D>b>KSl=ZzwLsT1w;(aOL_aApIXg8kMLz{77M}?gi!T5w#1xpEz*GYO D53wu$ diff --git a/frontend/src/pages/scenario.jsx b/frontend/src/pages/scenario.jsx index b974f4b..3f13923 100644 --- a/frontend/src/pages/scenario.jsx +++ b/frontend/src/pages/scenario.jsx @@ -1,9 +1,8 @@ import React, { useState, useEffect, useRef } from 'react'; import { Stage, Layer, Circle, Text, Line } from 'react-konva'; -import { Slider, Button } from '@mui/material'; +import { Slider, Button, MenuItem, Select, Typography, Box } from '@mui/material'; import axios from 'axios'; - const EARTH_RADIUS_KM = 6371; // Earth's radius in kilometers const EARTH_DISPLAY_SCALE = 0.01; // Display scale for Earth const ASTEROID_DISPLAY_SCALE = 0.3; // Display scale for asteroids @@ -41,15 +40,16 @@ function Scenario() { x: EARTH_X, y: EARTH_Y, trajectory: [], - vx: 0, vy: 0 + vx: 0, + vy: 0, }); - const rocketDistanceRef = useRef(10000); - + const [rocketDistance, setRocketDistance] = useState(10000); + const [collisionOccurred, setCollisionOccurred] = useState(false); useEffect(() => { - const fetchAsteroids = async (self, request) => { + const fetchAsteroids = async () => { try { - const response = await axios.get(`http://localhost:8000/api/sentry/`); + const response = await axios.get('http://localhost:8080/api/sentry/'); asteroidsData.current = response.data.near_earth_objects; setAsteroidData(0); // Set initial asteroid } catch (error) { @@ -59,8 +59,6 @@ function Scenario() { fetchAsteroids(); }, []); - - const estimateMass = (diameter) => { const radius = diameter / 2; const volume = (4 / 3) * Math.PI * Math.pow(radius, 3); @@ -85,7 +83,8 @@ function Scenario() { setTrajectoryPoints([]); calculateForecastPath(size, speed, Math.PI / 9, mass); // Calculate the forecast path once setRocket({ active: false, x: EARTH_X, y: EARTH_Y, trajectory: [], vx: 0, vy: 0 }); - + setRocketDistance(10000); + setCollisionOccurred(false); }; const handleAsteroidSelect = (event) => { @@ -138,9 +137,19 @@ function Scenario() { setForecastPoints(points); }; - // useEffect(() => { - // - // }, [rocketDistanceRef]); + const applyVelocityImpulse = (asteroid, strategy, rocketDx, rocketDy) => { + let impulseX = 0; + let impulseY = 0; + const angle = Math.atan2(rocketDy, rocketDx); + if (strategy === 'Nuclear Detonation') { + impulseX = 0.01 * Math.cos(angle); + impulseY = 0.01 * Math.sin(angle); + } else if (strategy === 'Kinetic Impact') { + impulseX = 0.005 * Math.cos(angle); + impulseY = 0.005 * Math.sin(angle); + } + return { vx: asteroid.vx + impulseX, vy: asteroid.vy + impulseY }; + }; const simulate = () => { let { x, y, speed, angle, mass } = asteroid; @@ -170,47 +179,54 @@ function Scenario() { x += vx * timeStep; y += vy * timeStep; - rocketDistanceRef.current = 1000; - + // Update rocket position setRocket((prev) => { - // Update rocket position const rocketDx = x - prev.x; const rocketDy = y - prev.y; - - const rocketDist = Math.sqrt(rocketDx * rocketDx + rocketDy* rocketDy); + const rocketDistance = Math.sqrt(rocketDx * rocketDx + rocketDy * rocketDy); const rocketAngle = Math.atan2(rocketDy, rocketDx); + const rocketVX = ROCKET_SPEED * Math.cos(rocketAngle); - const rocketVY = ROCKET_SPEED * Math.sin(rocketAngle) ; + const rocketVY = ROCKET_SPEED * Math.sin(rocketAngle); const newX = prev.x + rocketVX * timeStep; const newY = prev.y + rocketVY * timeStep; - rocketDistanceRef.current=rocketDist; - const temprocket = { + if (rocketDistance <= asteroid.size * ASTEROID_DISPLAY_SCALE && !collisionOccurred) { + const newVelocity = applyVelocityImpulse({ vx, vy }, strategy, rocketDx, rocketDy); + vx = newVelocity.vx; + vy = newVelocity.vy; + setSimulationResult('Rocket intercepted the asteroid!'); + setCollisionOccurred(true); // Mark collision occurred + return { ...prev, active: false, x: newX, y: newY, vx: 0, vy: 0 }; // Stop the rocket + } + + return { + ...prev, x: newX, y: newY, - vx: rocketVX, - vy: rocketVY, + vx: prev.active ? rocketVX : 0, // Stop velocity if inactive + vy: prev.active ? rocketVY : 0, // Stop velocity if inactive trajectory: [...prev.trajectory, newX, newY], }; - - return temprocket; }); - console.log('rocketDistance:', rocketDistanceRef); - if (rocketDistanceRef < asteroid.size * ASTEROID_DISPLAY_SCALE) { - setSimulationResult('Rocket intercepted the asteroid!'); - setIsSimulating(false); - return; - } + setRocketDistance(rocketDistance); + + if (rocketDistance <= asteroid.size * ASTEROID_DISPLAY_SCALE && !collisionOccurred) { + setSimulationResult('Rocket intercepted the asteroid!'); + setIsSimulating(false); + return; + } + if (y > CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x > CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER || y < -CANVAS_HEIGHT * SIMULATION_AREA_MULTIPLIER || x < -CANVAS_WIDTH * SIMULATION_AREA_MULTIPLIER) { setSimulationResult('Asteroid missed Earth!'); setIsSimulating(false); return; } - setAsteroid(prev => ({ ...prev, x, y })); - setTrajectoryPoints(prev => [...prev, x, y]); + setAsteroid((prev) => ({ ...prev, x, y })); + setTrajectoryPoints((prev) => [...prev, x, y]); animationRef.current = window.requestAnimationFrame(updateFrame); }; @@ -234,50 +250,67 @@ function Scenario() { }; const handleAngleChange = (event, newValue) => { - setAsteroid(prev => ({ ...prev, angle: newValue })); + setAsteroid((prev) => ({ ...prev, angle: newValue })); calculateForecastPath(asteroid.size, asteroid.speed, newValue, asteroid.mass); }; return ( <> -
-

Asteroid Collision Scenario

- - + + + Asteroid Collision Scenario + + + + + + + {simulationResult && ( -
-

Simulation Result

-

{simulationResult}

-
+ + Simulation Result + {simulationResult} + )} {asteroid.name && ( -
-

Asteroid Information

-

Name: {asteroid.name}

-

Size: {asteroid.size.toFixed(3)} kilometers

-

Speed: {(asteroid.speed * 1000).toFixed(3)} km/s

-

Mass: {asteroid.mass.toExponential(3)} kg

-
+ + Asteroid Information + Name: {asteroid.name} + Size: {asteroid.size.toFixed(3)} kilometers + Speed: {(asteroid.speed * 1000).toFixed(3)} km/s + Mass: {asteroid.mass.toExponential(3)} kg + )} -
-

Time Step: {timeStep}

+ + Time Step: {timeStep} -
-
-

Initial Angle: {(asteroid.angle * 180 / Math.PI).toFixed(2)}°

+ + + Initial Angle: {(asteroid.angle * 180 / Math.PI).toFixed(2)}° -
-
+ + @@ -314,7 +347,7 @@ function Scenario() { )} {rocket.trajectory.length > 0 && ( - + )} From ee810c04d1c08d082af7734a3ed95c5106bb84d3 Mon Sep 17 00:00:00 2001 From: Dan Date: Sun, 19 May 2024 03:22:30 -0400 Subject: [PATCH 4/5] add ignored pycache --- backend/deep_impact_proj/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/deep_impact_proj/.gitignore b/backend/deep_impact_proj/.gitignore index c66ba3a..b741592 100644 --- a/backend/deep_impact_proj/.gitignore +++ b/backend/deep_impact_proj/.gitignore @@ -1,2 +1,3 @@ .env -.venv \ No newline at end of file +.venv +/__pycache__/ \ No newline at end of file From 78a875d5b270fac565e7cfef4e4a1afd086c44d5 Mon Sep 17 00:00:00 2001 From: Jordan Yamada Date: Sun, 19 May 2024 15:49:13 +0000 Subject: [PATCH 5/5] (WIP) resolving merge conflict --- .../api_app/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 188 bytes .../api_app/__pycache__/admin.cpython-311.pyc | Bin 0 -> 243 bytes backend/api_app/__pycache__/apps.cpython-311.pyc | Bin 0 -> 560 bytes .../api_app/__pycache__/models.cpython-311.pyc | Bin 0 -> 240 bytes backend/api_app/__pycache__/urls.cpython-311.pyc | Bin 0 -> 557 bytes .../api_app/__pycache__/utils.cpython-311.pyc | Bin 0 -> 1453 bytes .../api_app/__pycache__/views.cpython-311.pyc | Bin 0 -> 1492 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 199 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 197 bytes .../__pycache__/settings.cpython-311.pyc | Bin 0 -> 3121 bytes .../__pycache__/urls.cpython-311.pyc | Bin 0 -> 1198 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 0 -> 737 bytes frontend/.gitignore | 1 + 13 files changed, 1 insertion(+) create mode 100644 backend/api_app/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/admin.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/apps.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/models.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/urls.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/utils.cpython-311.pyc create mode 100644 backend/api_app/__pycache__/views.cpython-311.pyc create mode 100644 backend/api_app/migrations/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/deep_impact_proj/__pycache__/__init__.cpython-311.pyc create mode 100644 backend/deep_impact_proj/__pycache__/settings.cpython-311.pyc create mode 100644 backend/deep_impact_proj/__pycache__/urls.cpython-311.pyc create mode 100644 backend/deep_impact_proj/__pycache__/wsgi.cpython-311.pyc create mode 100644 frontend/.gitignore diff --git a/backend/api_app/__pycache__/__init__.cpython-311.pyc b/backend/api_app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7a8b7ee4a3f6ed97b5ceef147f691f708be5b09 GIT binary patch literal 188 zcmZ3^%ge<81j_S0(?IlN5CH>>P{wCAAY(d13PUi1CZpdb>KSl=ZzwLsT1w;(aOL_aApIXg8kML)41Gd{7P vKp$+AUP0wA4x8Nkl+v73yCM#t;fz3BEDIz)Ff%eT-e6F;fDIL~0aXA1#9~0A literal 0 HcmV?d00001 diff --git a/backend/api_app/__pycache__/apps.cpython-311.pyc b/backend/api_app/__pycache__/apps.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57db576dcf82537865411614e471a3c8d4be852d GIT binary patch literal 560 zcmZutJx{|h5IrX;6xt$$0EvMCF=ZfGK|)BS6{xC&kl3OuUk(Oe&R8oW{X64mh|-WP~PktRE&<^ literal 0 HcmV?d00001 diff --git a/backend/api_app/__pycache__/models.cpython-311.pyc b/backend/api_app/__pycache__/models.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa3969f130dd16a4b9a041daec6919807c2b22a4 GIT binary patch literal 240 zcmZ3^%ge<81j_S0(=37XV-N=hn4pZ$LO{lJh7^Vr#vF!R#wbQch7_h?22JLdAO)I? zx7c#?Q&Mw^{WO_wai(M?=B4NBr6d(G10`27d?~K-`#0O?ZM#dWqG8eF+A~v830LXwpL;wH) literal 0 HcmV?d00001 diff --git a/backend/api_app/__pycache__/urls.cpython-311.pyc b/backend/api_app/__pycache__/urls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82f345dbfca48c7856df3bf23277e5e629b8de7b GIT binary patch literal 557 zcmaJ-y-Ncz6i@DQceSO6&_!?&T{>u%4h|xSMJPfQ+-{NBMBDQ&IdbPmJ9TuD4uYdw zRrHVWPpIHfZgp}ixHTc#ZgD%bBHOnk;uDN4BrqqS?ZEl0?*q8~G!S?0+`bJSkTJd2c%aFjHMyTP`t1agWq_RN6tjIdOF>!_twwr52g9X(){((fK(nx<&ji| SB==8rl5Z}G?#Ty6voTh0+X(N|ZNS44CR}raD0Xc~!N|6&11IqDmTz#9wj_=Ow zUg8GD)IvO@s1gWO3KBx}g;XefiS`rN$Q9N}dE$vTOL?jK#H{}&=8e7Gnc3Nyx!L*6 zJ_(0I2*wvzKiv31Lg;U?=?%FnoK`_NL>97e5!qPBSjbXQ(xo<+bs4x^4A_dUw9f*? z5j&^{ZK4xmR!U!G1>I^+>jeLvrh$XF|c<>*gjALK@ z)GX#L)62U~nlYDUKu1<7FS!n<@qj<}K{mT$+?bs;mhboz-OZelSvD4zGud<|>qooF zq_Mb~PG!?e{>8Rt4ty3;OU7#Y<4@9SSwFG{)~oAAYUQ?ZC%vBQrqyN&P*I@MSxEN~ zjUum~HbRBIY+)}jaQhkkBAvft1?{89y+RKRK{|qU+}B`XcP3K*V92h5y?&7q+Q;6R zLjNHh0mR3!I%5sZATQF}A#@!vts;5j1I_+Wwium@E_oLQw!_hL(mJ$BMfw`R>+muz zqkHl?D&x4E`D$*<^Gf_3O*2dRgky3uvFYw=4s|s~xu@+W+wxuJmN|VNY>aKX_bxy^ z!adX5;qj1982xewY`HIQQqPZY>UeC==-T>GX689HHe6Lh3Eg zmIprqa$FWMJB{QApv6odQ!cDxvDnLxv@O@BTES(O>Fk-dX_?xhYtfaW>A9|>tuVJh za~{{0C@sBp+b)?oPrGa8wy9%@OG08LZO6+Od7`xEhahF6lQFvle^6oZUx8FnOA0DC zPbOY_bgLHIeEt~)3bQ`3)tJ~iAWahei(LDYT&t6r2AQdmnWj4RedW8#gZmHf9|TU+ zshU=|;uaV*T z0!B-L0KoY)-)DlWO4iMI5o1k%O^Gi_RS*><8=`!+=WA!?sg;f6qOqpLp literal 0 HcmV?d00001 diff --git a/backend/api_app/__pycache__/views.cpython-311.pyc b/backend/api_app/__pycache__/views.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54943ddc93cba2fd4f9c6bc6858b279520890135 GIT binary patch literal 1492 zcmbVM&1(}u6rb76$0p5J?T4Q&6%h?+(uzkBY8$jFX>Ft8UdA;u)wKKN%tozv$iahx zClPw}R1yD~2qIxX5Ipr3si&TNvzyq)dU8H~^WOW-yxDp0B_FccG=g@2;`-`o4WS=O z>9=@K*!c>=CZdR98#&m-Sjn2LIl8HbvTn!B7}#_>ZpLAa*$F3UCPOZ68&1khg>u49 zJ45D>lQA<+*33FNGY9r0HSD}oFbf#5*xGRa`uB(W(*BjEwlG4UU`EXx(a=>y(=QPn zV#zHXIG8uAyc`WJ z7vap6*?F>Dxplj;QrlMV`G{ruAq$9LZooHWZUr1H-y?7}xly@SkKPnv|M@$kpl>3E zOiYofQT!5_I@RD|x=gHue(I3cKTXLhJUf#Bn<(h}0c{KBCzw$K54g%RpcFM36U<(f zNzNWOnFxe(GBve(v;4?&Sb5Fk)N(g0$D&qw&ZBI}wgS&{%S+r_WA#9k=Na?QFF3wc z56Ta$`Z@%w#;KMXuSqTr~4V+!^@>4Z`hC{pAB_CBc-Gg|Y}UbUk* zE(>(cavypn@yO#ry%`9uaw*4q=DNpOi9M?`U)8SQF-2;gkVZdqa+E^?$ts7~J@xo{ zDGWbXKXiHcFACJK%y~kwV}G$Cu!5%GN#MAlAf-V4m&kZCXxM^hm7HYmlLq(PFc~rz zRW>BPLDtzul#nn4gJIbNi;<+^DNL!BLj bS9gCZ>#sd3jd2Pp@&KrvVEy$EDy){@rN?6Q literal 0 HcmV?d00001 diff --git a/backend/api_app/migrations/__pycache__/__init__.cpython-311.pyc b/backend/api_app/migrations/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..826090a79a053e7b1e2e102d92ef2cc605a78c17 GIT binary patch literal 199 zcmZ3^%ge<81j_S0(?IlN5CH>>P{wCAAY(d13PUi1CZpd&ryk0@&FAkgB{FKt1RJ$Tppj9Bp6!Qa# R56p~=j2{?aL=iJk3;?C>Go1hc literal 0 HcmV?d00001 diff --git a/backend/deep_impact_proj/__pycache__/__init__.cpython-311.pyc b/backend/deep_impact_proj/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5447ac2fe0afc08f06349bbb209c06484ed894c6 GIT binary patch literal 197 zcmZ3^%ge<81j_S0(?IlN5CH>>P{wCAAY(d13PUi1CZpd2>er~FM zR(?@RVqRrpZemKJzH@#`YCuk6Nq&Bwen3%vR%&udvA#=cYJsk2Zb4#liGEUIa&~H7 zihc@EEItz~7GD5Vs2?AnnU`4-AFo$X`HRCQH$SB`C)KWq6=)I2DaHIi;sY}yBjX1K K7*WIw6axS literal 0 HcmV?d00001 diff --git a/backend/deep_impact_proj/__pycache__/settings.cpython-311.pyc b/backend/deep_impact_proj/__pycache__/settings.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..467f3903f1ecb6ab7abfac2e0ceaf7c55d19ba89 GIT binary patch literal 3121 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 Q%F20V<#@hm*&P@BFT!)(HUIzs literal 0 HcmV?d00001 diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file