Atom-Calculator / index.html
vip3's picture
Update index.html
fddac0d verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Advanced Atom Simulator</title>
<style>
body {
margin: 0;
overflow: hidden;
font-family: 'Roboto', sans-serif;
background: linear-gradient(to right, #0f2027, #203a43, #2c5364);
color: #f0f0f0;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
#controls {
position: absolute;
top: 10px;
width: 100%;
display: flex;
justify-content: center;
gap: 20px;
backdrop-filter: blur(10px);
padding: 20px;
background: rgba(255, 255, 255, 0.1);
border-radius: 10px;
z-index: 10;
}
.control {
display: flex;
flex-direction: column;
align-items: center;
}
.control label {
margin-bottom: 5px;
font-weight: bold;
}
.control input, .control select {
width: 80px;
padding: 10px;
border: none;
border-radius: 5px;
background: #333;
color: #fff;
text-align: center;
}
#info {
position: absolute;
bottom: 20px;
text-align: center;
background: rgba(255, 255, 255, 0.1);
padding: 20px;
border-radius: 10px;
backdrop-filter: blur(10px);
z-index: 10;
}
#info div {
margin: 5px 0;
font-size: 1.2em;
}
canvas {
background-color: transparent;
}
</style>
</head>
<body>
<div id="controls">
<div class="control">
<label for="elements">Element</label>
<select id="elements"></select>
</div>
<div class="control">
<label for="protons">Protons</label>
<input type="number" id="protons" min="1" value="1">
</div>
<div class="control">
<label for="neutrons">Neutrons</label>
<input type="number" id="neutrons" min="0" value="1">
</div>
<div class="control">
<label for="electrons">Electrons</label>
<input type="number" id="electrons" min="1" value="1">
</div>
</div>
<div id="info">
<div id="elementName">Element: Hydrogen</div>
<div id="azeNotation">AZE Notation: 2H1</div>
<div id="elementMass">Mass: 2.016 u</div>
</div>
<canvas id="atomCanvas"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
const canvas = document.getElementById('atomCanvas');
const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 10;
renderer.setSize(window.innerWidth, window.innerHeight);
const light = new THREE.AmbientLight(0x404040, 2);
scene.add(light);
const protonGeometry = new THREE.SphereGeometry(0.3, 32, 32);
const neutronGeometry = new THREE.SphereGeometry(0.3, 32, 32);
const electronGeometry = new THREE.SphereGeometry(0.1, 32, 32);
const protonMaterial = new THREE.MeshStandardMaterial({ color: 0xFF3333 });
const neutronMaterial = new THREE.MeshStandardMaterial({ color: 0x3333FF });
const electronMaterial = new THREE.MeshStandardMaterial({ color: 0x33FF33 });
const nucleus = new THREE.Group();
scene.add(nucleus);
const electrons = [];
const elements = {
1: { name: "Hydrogen", symbol: "H", mass: 1.008 },
2: { name: "Helium", symbol: "He", mass: 4.0026 },
3: { name: "Lithium", symbol: "Li", mass: 6.94 },
4: { name: "Beryllium", symbol: "Be", mass: 9.0122 },
5: { name: "Boron", symbol: "B", mass: 10.81 },
6: { name: "Carbon", symbol: "C", mass: 12.011 },
7: { name: "Nitrogen", symbol: "N", mass: 14.007 },
8: { name: "Oxygen", symbol: "O", mass: 15.999 },
9: { name: "Fluorine", symbol: "F", mass: 18.998 },
10: { name: "Neon", symbol: "Ne", mass: 20.180 },
11: { name: "Sodium", symbol: "Na", mass: 22.990 },
12: { name: "Magnesium", symbol: "Mg", mass: 24.305 },
13: { name: "Aluminium", symbol: "Al", mass: 26.982 },
14: { name: "Silicon", symbol: "Si", mass: 28.085 },
15: { name: "Phosphorus", symbol: "P", mass: 30.974 },
16: { name: "Sulfur", symbol: "S", mass: 32.06 },
17: { name: "Chlorine", symbol: "Cl", mass: 35.45 },
18: { name: "Argon", symbol: "Ar", mass: 39.948 },
19: { name: "Potassium", symbol: "K", mass: 39.098 },
20: { name: "Calcium", symbol: "Ca", mass: 40.078 },
21: { name: "Scandium", symbol: "Sc", mass: 44.956 },
22: { name: "Titanium", symbol: "Ti", mass: 47.867 },
23: { name: "Vanadium", symbol: "V", mass: 50.942 },
24: { name: "Chromium", symbol: "Cr", mass: 51.996 },
25: { name: "Manganese", symbol: "Mn", mass: 54.938 },
26: { name: "Iron", symbol: "Fe", mass: 55.845 },
27: { name: "Cobalt", symbol: "Co", mass: 58.933 },
28: { name: "Nickel", symbol: "Ni", mass: 58.693 },
29: { name: "Copper", symbol: "Cu", mass: 63.546 },
30: { name: "Zinc", symbol: "Zn", mass: 65.38 },
31: { name: "Gallium", symbol: "Ga", mass: 69.723 },
32: { name: "Germanium", symbol: "Ge", mass: 72.630 },
33: { name: "Arsenic", symbol: "As", mass: 74.922 },
34: { name: "Selenium", symbol: "Se", mass: 78.971 },
35: { name: "Bromine", symbol: "Br", mass: 79.904 },
36: { name: "Krypton", symbol: "Kr", mass: 83.798 },
37: { name: "Rubidium", symbol: "Rb", mass: 85.468 },
38: { name: "Strontium", symbol: "Sr", mass: 87.62 },
39: { name: "Yttrium", symbol: "Y", mass: 88.906 },
40: { name: "Zirconium", symbol: "Zr", mass: 91.224 },
41: { name: "Niobium", symbol: "Nb", mass: 92.906 },
42: { name: "Molybdenum", symbol: "Mo", mass: 95.95 },
43: { name: "Technetium", symbol: "Tc", mass: 98 },
44: { name: "Ruthenium", symbol: "Ru", mass: 101.07 },
45: { name: "Rhodium", symbol: "Rh", mass: 102.91 },
46: { name: "Palladium", symbol: "Pd", mass: 106.42 },
47: { name: "Silver", symbol: "Ag", mass: 107.87 },
48: { name: "Cadmium", symbol: "Cd", mass: 112.41 },
49: { name: "Indium", symbol: "In", mass: 114.82 },
50: { name: "Tin", symbol: "Sn", mass: 118.71 },
51: { name: "Antimony", symbol: "Sb", mass: 121.76 },
52: { name: "Tellurium", symbol: "Te", mass: 127.60 },
53: { name: "Iodine", symbol: "I", mass: 126.90 },
54: { name: "Xenon", symbol: "Xe", mass: 131.29 },
55: { name: "Cesium", symbol: "Cs", mass: 132.91 },
56: { name: "Barium", symbol: "Ba", mass: 137.33 },
57: { name: "Lanthanum", symbol: "La", mass: 138.91 },
58: { name: "Cerium", symbol: "Ce", mass: 140.12 },
59: { name: "Praseodymium", symbol: "Pr", mass: 140.91 },
60: { name: "Neodymium", symbol: "Nd", mass: 144.24 },
61: { name: "Promethium", symbol: "Pm", mass: 145 },
62: { name: "Samarium", symbol: "Sm", mass: 150.36 },
63: { name: "Europium", symbol: "Eu", mass: 151.96 },
64: { name: "Gadolinium", symbol: "Gd", mass: 157.25 },
65: { name: "Terbium", symbol: "Tb", mass: 158.93 },
66: { name: "Dysprosium", symbol: "Dy", mass: 162.50 },
67: { name: "Holmium", symbol: "Ho", mass: 164.93 },
68: { name: "Erbium", symbol: "Er", mass: 167.26 },
69: { name: "Thulium", symbol: "Tm", mass: 168.93 },
70: { name: "Ytterbium", symbol: "Yb", mass: 173.05 },
71: { name: "Lutetium", symbol: "Lu", mass: 174.97 },
72: { name: "Hafnium", symbol: "Hf", mass: 178.49 },
73: { name: "Tantalum", symbol: "Ta", mass: 180.95 },
74: { name: "Tungsten", symbol: "W", mass: 183.84 },
75: { name: "Rhenium", symbol: "Re", mass: 186.21 },
76: { name: "Osmium", symbol: "Os", mass: 190.23 },
77: { name: "Iridium", symbol: "Ir", mass: 192.22 },
78: { name: "Platinum", symbol: "Pt", mass: 195.08 },
79: { name: "Gold", symbol: "Au", mass: 196.97 },
80: { name: "Mercury", symbol: "Hg", mass: 200.59 },
81: { name: "Thallium", symbol: "Tl", mass: 204.38 },
82: { name: "Lead", symbol: "Pb", mass: 207.2 },
83: { name: "Bismuth", symbol: "Bi", mass: 208.98 },
84: { name: "Polonium", symbol: "Po", mass: 209 },
85: { name: "Astatine", symbol: "At", mass: 210 },
86: { name: "Radon", symbol: "Rn", mass: 222 },
87: { name: "Francium", symbol: "Fr", mass: 223 },
88: { name: "Radium", symbol: "Ra", mass: 226 },
89: { name: "Actinium", symbol: "Ac", mass: 227 },
90: { name: "Thorium", symbol: "Th", mass: 232.04 },
91: { name: "Protactinium", symbol: "Pa", mass: 231.04 },
92: { name: "Uranium", symbol: "U", mass: 238.03 },
93: { name: "Neptunium", symbol: "Np", mass: 237 },
94: { name: "Plutonium", symbol: "Pu", mass: 244 },
95: { name: "Americium", symbol: "Am", mass: 243 },
96: { name: "Curium", symbol: "Cm", mass: 247 },
97: { name: "Berkelium", symbol: "Bk", mass: 247 },
98: { name: "Californium", symbol: "Cf", mass: 251 },
99: { name: "Einsteinium", symbol: "Es", mass: 252 },
100: { name: "Fermium", symbol: "Fm", mass: 257 },
101: { name: "Mendelevium", symbol: "Md", mass: 258 },
102: { name: "Nobelium", symbol: "No", mass: 259 },
103: { name: "Lawrencium", symbol: "Lr", mass: 266 },
104: { name: "Rutherfordium", symbol: "Rf", mass: 267 },
105: { name: "Dubnium", symbol: "Db", mass: 270 },
106: { name: "Seaborgium", symbol: "Sg", mass: 271 },
107: { name: "Bohrium", symbol: "Bh", mass: 270 },
108: { name: "Hassium", symbol: "Hs", mass: 277 },
109: { name: "Meitnerium", symbol: "Mt", mass: 278 },
110: { name: "Darmstadtium", symbol: "Ds", mass: 281 },
111: { name: "Roentgenium", symbol: "Rg", mass: 282 },
112: { name: "Copernicium", symbol: "Cn", mass: 285 },
113: { name: "Nihonium", symbol: "Nh", mass: 286 },
114: { name: "Flerovium", symbol: "Fl", mass: 289 },
115: { name: "Moscovium", symbol: "Mc", mass: 290 },
116: { name: "Livermorium", symbol: "Lv", mass: 293 },
117: { name: "Tennessine", symbol: "Ts", mass: 294 },
118: { name: "Oganesson", symbol: "Og", mass: 294 }
};
const elementSelect = document.getElementById('elements');
Object.keys(elements).forEach(key => {
const option = document.createElement('option');
option.value = key;
option.textContent = elements[key].name;
elementSelect.appendChild(option);
});
function createParticles(numProtons, numNeutrons, numElectrons) {
nucleus.clear();
electrons.forEach(e => scene.remove(e));
electrons.length = 0;
for (let i = 0; i < numProtons; i++) {
const proton = new THREE.Mesh(protonGeometry, protonMaterial);
proton.position.set((Math.random() - 0.5), (Math.random() - 0.5), (Math.random() - 0.5));
nucleus.add(proton);
}
for (let i = 0; i < numNeutrons; i++) {
const neutron = new THREE.Mesh(neutronGeometry, neutronMaterial);
neutron.position.set((Math.random() - 0.5), (Math.random() - 0.5), (Math.random() - 0.5));
nucleus.add(neutron);
}
for (let i = 0; i < numElectrons; i++) {
const electron = new THREE.Mesh(electronGeometry, electronMaterial);
const angle = (i / numElectrons) * Math.PI * 2;
const radius = 2.5;
electron.position.set(Math.cos(angle) * radius, Math.sin(angle) * radius, 0);
scene.add(electron);
electrons.push(electron);
}
}
function animate() {
requestAnimationFrame(animate);
nucleus.rotation.y += 0.01;
electrons.forEach((e, i) => {
e.position.x = Math.cos(Date.now() * 0.001 + i) * 2.5;
e.position.y = Math.sin(Date.now() * 0.001 + i) * 2.5;
});
renderer.render(scene, camera);
}
function updateInfo() {
const numProtons = parseInt(document.getElementById('protons').value);
const numNeutrons = parseInt(document.getElementById('neutrons').value);
const numElectrons = parseInt(document.getElementById('electrons').value);
const selectedElement = elements[numProtons] || { name: "Unknown", symbol: "?", mass: 0 };
const massNumber = numProtons + numNeutrons;
const calculatedMass = numProtons * 1.007 + numNeutrons * 1.008 + numElectrons * 0.00055;
document.getElementById('elementName').textContent = `Element: ${selectedElement.name}`;
document.getElementById('azeNotation').textContent = `AZE Notation: ${massNumber}${selectedElement.symbol}${numProtons}`;
document.getElementById('elementMass').textContent = `Mass: ${calculatedMass.toFixed(3)} u`;
}
document.querySelectorAll('input[type="number"]').forEach(input => {
input.addEventListener('input', () => {
const numProtons = parseInt(document.getElementById('protons').value);
const numNeutrons = parseInt(document.getElementById('neutrons').value);
const numElectrons = parseInt(document.getElementById('electrons').value);
createParticles(numProtons, numNeutrons, numElectrons);
updateInfo();
});
});
elementSelect.addEventListener('change', () => {
const selectedElement = elements[elementSelect.value];
document.getElementById('protons').value = elementSelect.value;
document.getElementById('neutrons').value = Math.round(selectedElement.mass) - elementSelect.value;
document.getElementById('electrons').value = elementSelect.value;
createParticles(elementSelect.value, Math.round(selectedElement.mass) - elementSelect.value, elementSelect.value);
updateInfo();
});
createParticles(1, 1, 1);
animate();
updateInfo();
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
</script>
</body>
</html>