// ==UserScript==
// @name Useless Things Series: Circle 5 - Solar System Simulation
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Simulates a basic solar system with circles representing planets, orbits, and direction indicators.
// @match *://*/*
// @grant none
// @license MIT
// @namespace https://gf.qytechs.cn/users/1126616
// ==/UserScript==
(function() {
'use strict';
// Function to generate a random color
function randomColor() {
return '#' + Math.floor(Math.random()*16777215).toString(16);
}
// Function to generate random velocity vector
function randomVelocity(speed) {
const angle = Math.random() * Math.PI * 2;
return {
x: Math.cos(angle) * speed,
y: Math.sin(angle) * speed
};
}
// Function to update planet positions and draw them on the canvas
function updateAndDrawPlanets(ctx, planets) {
planets.forEach(planet => {
planet.angle += planet.angularSpeed;
planet.x = planet.centerX + Math.cos(planet.angle) * planet.distance;
planet.y = planet.centerY + Math.sin(planet.angle) * planet.distance;
// Draw orbit
ctx.beginPath();
ctx.arc(planet.centerX, planet.centerY, planet.distance, 0, Math.PI * 2);
ctx.strokeStyle = 'rgba(255,69,0)';
ctx.stroke();
ctx.closePath();
// Draw direction indicator
const directionX = planet.centerX + Math.cos(planet.angle) * (planet.distance - planet.radius - 5);
const directionY = planet.centerY + Math.sin(planet.angle) * (planet.distance - planet.radius - 5);
ctx.beginPath();
ctx.moveTo(planet.centerX, planet.centerY);
ctx.lineTo(directionX, directionY);
ctx.strokeStyle = 'rgba(255,191,0)';
ctx.stroke();
ctx.closePath();
// Draw planet
ctx.beginPath();
ctx.arc(planet.x, planet.y, planet.radius, 0, Math.PI * 2);
ctx.fillStyle = planet.color;
ctx.fill();
ctx.closePath();
});
}
// Main function to initialize and run the solar system simulation
function runSolarSystem(numPlanets, sunRadius, planetDistances, planetSpeeds, planetRadii) {
const canvas = document.createElement('canvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.position = 'fixed';
canvas.style.top = '0';
canvas.style.left = '0';
canvas.style.pointerEvents = 'none';
canvas.style.zIndex = '9999';
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');
const planets = [];
// Generate sun
const sunX = canvas.width / 2;
const sunY = canvas.height / 2;
planets.push({ x: sunX, y: sunY, centerX: sunX, centerY: sunY, distance: 0, angle: 0, angularSpeed: 0, color: '#ffcc00', radius: sunRadius });
// Generate planets
for (let i = 0; i < numPlanets; i++) {
const distance = planetDistances[i] * 50 + 100; // Scale distances for better visualization
const angularSpeed = planetSpeeds[i] / distance; // Orbital speed decreases with distance
const color = randomColor();
const radius = planetRadii[i] / 10; // Scale radii for better visualization
planets.push({ x: sunX + distance, y: sunY, centerX: sunX, centerY: sunY, distance: distance, angle: Math.random() * Math.PI * 2, angularSpeed: angularSpeed, color: color, radius: radius });
}
// Update and draw planets and grid
setInterval(() => {
ctx.clearRect(0, 0, canvas.width, canvas.height); // Clear canvas
updateAndDrawPlanets(ctx, planets); // Update and draw planets
}, 1000 / 60); // Update at 60 frames per second
}
// Define parameters for the solar system
const numPlanets = 8; // Number of planets (including dwarf planets like Pluto)
const sunRadius = 30; // Radius of the sun
const planetDistances = [0.4, 0.7, 1.0, 1.5, 2.2, 3.0, 4.0, 5.0]; // Relative distances of planets from the sun
const planetSpeeds = [0.8, 0.6, 0.5, 0.4, 0.3, 0.2, 0.15, 0.1]; // Angular speeds of planets (radians per frame)
const planetRadii = [20, 40, 60, 80, 100, 120, 140, 160]; // Relative radii of planets
// Run the solar system simulation
runSolarSystem(numPlanets, sunRadius, planetDistances, planetSpeeds, planetRadii);
})();