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 96988ff..a4b76cd 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/__init__.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/__init__.cpython-311.pyc differ 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 aea8442..c8277e4 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/admin.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/admin.cpython-311.pyc differ 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 331dfe9..4f32680 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/apps.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/apps.cpython-311.pyc differ diff --git a/backend/deep_impact_proj/api_app/__pycache__/models.cpython-311.pyc b/backend/deep_impact_proj/api_app/__pycache__/models.cpython-311.pyc index 6b3e232..60807df 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/models.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/models.cpython-311.pyc differ 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 0ae640f..152c84f 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/urls.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/urls.cpython-311.pyc differ 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 11ac1df..bce4ab9 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/utils.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/utils.cpython-311.pyc differ 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 23785c7..44d1d2d 100644 Binary files a/backend/deep_impact_proj/api_app/__pycache__/views.cpython-311.pyc and b/backend/deep_impact_proj/api_app/__pycache__/views.cpython-311.pyc differ diff --git a/backend/deep_impact_proj/api_app/migrations/__pycache__/__init__.cpython-311.pyc b/backend/deep_impact_proj/api_app/migrations/__pycache__/__init__.cpython-311.pyc index 19149c1..56c39e0 100644 Binary files a/backend/deep_impact_proj/api_app/migrations/__pycache__/__init__.cpython-311.pyc and b/backend/deep_impact_proj/api_app/migrations/__pycache__/__init__.cpython-311.pyc differ diff --git a/backend/deep_impact_proj/deep_impact_proj/__pycache__/__init__.cpython-311.pyc b/backend/deep_impact_proj/deep_impact_proj/__pycache__/__init__.cpython-311.pyc index 00cb333..7b76c90 100644 Binary files a/backend/deep_impact_proj/deep_impact_proj/__pycache__/__init__.cpython-311.pyc and b/backend/deep_impact_proj/deep_impact_proj/__pycache__/__init__.cpython-311.pyc differ diff --git a/backend/deep_impact_proj/deep_impact_proj/__pycache__/settings.cpython-311.pyc b/backend/deep_impact_proj/deep_impact_proj/__pycache__/settings.cpython-311.pyc index 74aab0a..8be5445 100644 Binary files a/backend/deep_impact_proj/deep_impact_proj/__pycache__/settings.cpython-311.pyc and b/backend/deep_impact_proj/deep_impact_proj/__pycache__/settings.cpython-311.pyc differ 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 3a1cce6..3b34415 100644 Binary files a/backend/deep_impact_proj/deep_impact_proj/__pycache__/urls.cpython-311.pyc and b/backend/deep_impact_proj/deep_impact_proj/__pycache__/urls.cpython-311.pyc differ 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 7caa192..39afbf7 100644 Binary files a/backend/deep_impact_proj/deep_impact_proj/__pycache__/wsgi.cpython-311.pyc and b/backend/deep_impact_proj/deep_impact_proj/__pycache__/wsgi.cpython-311.pyc differ 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 && ( - + )}