<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rotating Monte Carlo Octahedron</title>
<style>
body { margin: 0; overflow: hidden; background: black; }
canvas { display: block; }
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="script.js"></script>
</body>
</html>
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const vertices = [
[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]
];
const edges = [
[0, 2], [0, 3], [0, 4], [0, 5],
[1, 2], [1, 3], [1, 4], [1, 5],
[2, 4], [2, 5], [3, 4], [3, 5]
];
let angleX = 0;
let angleY = 0;
function rotateX(point, angle) {
const [x, y, z] = point;
const cos = Math.cos(angle);
const sin = Math.sin(angle);
return [x, y * cos - z * sin, y * sin + z * cos];
}
function rotateY(point, angle) {
const [x, y, z] = point;
const cos = Math.cos(angle);
const sin = Math.sin(angle);
return [x * cos + z * sin, y, -x * sin + z * cos];
}
function project(point) {
const [x, y, z] = point;
const scale = 300 / (z + 5);
return [x * scale + canvas.width / 2, y * scale + canvas.height / 2];
}
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.strokeStyle = `hsl(${(angleX + angleY) * 50}, 100%, 50%)`;
ctx.lineWidth = 2;
const rotatedVertices = vertices.map(v => rotateY(rotateX(v, angleX), angleY));
const projectedVertices = rotatedVertices.map(project);
edges.forEach(([i, j]) => {
const [x1, y1] = projectedVertices[i];
const [x2, y2] = projectedVertices[j];
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
});
angleX += 0.01;
angleY += 0.01;
requestAnimationFrame(draw);
}
draw();
window.addEventListener('resize', () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.