import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CelestialBodySimulator extends JPanel {
private static final int SCREEN_WIDTH = 2160;
private static final int SCREEN_HEIGHT = 2160;
private static final int SUN_RADIUS = 50;
// Planet data: name, radius, orbit radius, orbit speed, color
private static final Object[][] PLANETS = {
{"Mercury", 10, 100, 0.02, new Color(128, 128, 128)},
{"Venus", 15, 150, 0.015, new Color(255, 165, 0)},
{"Earth", 20, 200, 0.01, new Color(0, 0, 255)},
{"Mars", 17, 250, 0.008, new Color(255, 0, 0)},
{"Jupiter", 40, 350, 0.005, new Color(255, 215, 0)},
{"Saturn", 35, 450, 0.004, new Color(210, 180, 140)},
{"Uranus", 30, 550, 0.003, new Color(0, 255, 255)},
{"Neptune", 30, 650, 0.002, new Color(0, 0, 139)},
{"Pluto", 8, 750, 0.001, new Color(165, 42, 42)}
};
private static class CelestialBody {
private String name;
private int radius;
private int orbitRadius;
private double orbitSpeed;
private Color color;
private double angle;
public CelestialBody(String name, int radius, int orbitRadius, double orbitSpeed, Color color) {
this.name = name;
this.radius = radius;
this.orbitRadius = orbitRadius;
this.orbitSpeed = orbitSpeed;
this.color = color;
this.angle = 0;
}
public void update(double dt) {
angle += orbitSpeed * dt;
}
public int[] getPosition() {
int x = SCREEN_WIDTH / 2 + (int) (Math.cos(angle) * orbitRadius);
int y = SCREEN_HEIGHT / 2 + (int) (Math.sin(angle) * orbitRadius);
return new int[] {x, y};
}
public double calculateVolume() {
double volume = (4.0 / 3.0) * Math.PI * Math.pow(radius, 3);
return volume;
}
public double calculateSurfaceArea() {
double surfaceArea = 4.0 * Math.PI * Math.pow(radius, 2);
return surfaceArea;
}
public double calculateOrbitalVelocity() {
if (orbitSpeed == 0) {
return Double.POSITIVE_INFINITY;
}
double orbitalVelocity = 2.0 * Math.PI * orbitRadius / orbitSpeed;
return orbitalVelocity;
}
public void draw(Graphics2D g2d) {
int[] position = getPosition();
int x = position[0];
int y = position[1];
// Display the name
g2d.setFont(new Font("Arial", Font.PLAIN, 16));
g2d.setColor(Color.WHITE);
g2d.drawString(name, x, y + radius + 20);
// Perform scientific calculations for each planet
double volume = calculateVolume();
double surfaceArea = calculateSurfaceArea();
double orbitalVelocity = calculateOrbitalVelocity();
// Display the calculations
g2d.setFont(new Font("Arial", Font.PLAIN, 14));
g2d.drawString("Volume: " + String.format("%.2f", volume), x, y + radius + 40);
g2d.drawString("Surface Area: " + String.format("%.2f", surfaceArea), x, y + radius + 55);
g2d.drawString("Orbital Velocity: " + String.format("%.2f", orbitalVelocity), x, y + radius + 70);
// Draw the body
g2d.setColor(color);
g2d.fillOval(x - radius, y - radius, radius * 2, radius * 2);
}
}
private CelestialBody sun;
private CelestialBody[] planets;
public CelestialBodySimulator() {
sun = new CelestialBody("Sun", SUN_RADIUS, 0, 0, new Color(255, 255, 0));
planets = new CelestialBody[PLANETS.length];
for (int i = 0; i < PLANETS.length; i++) {
Object[] planetData = PLANETS[i];
String name = (String) planetData[0];
int radius = (int) planetData[1];
int orbitRadius = (int) planetData[2];
double orbitSpeed = (double) planetData[3];
Color color = (Color) planetData[4];
planets[i] = new CelestialBody(name, radius, orbitRadius, orbitSpeed, color);
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.BLACK);
g2d.fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
for (CelestialBody planet : planets) {
planet.update(1.0 / 60.0); // Assuming 60 FPS
planet.draw(g2d);
}
sun.draw(g2d);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Planetary System");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
frame.setResizable(false);
CelestialBodySimulator simulator = new CelestialBodySimulator();
frame.setContentPane(simulator);
frame.setVisible(true);
while (true) {
simulator.repaint();
try {
Thread.sleep(16); // Delay for 60 FPS (approximately)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}