Meta Description" name="description" />
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AI Thinking Orb - Neural</title>
<style>
body {
margin: 0;
background: #0a0a0f;
color: #aaa;
font-family: monospace;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
}
canvas {
display: block;
}
#status {
margin-top: 20px;
font-size: 14px;
opacity: 0.8;
letter-spacing: 1px;
}
</style>
</head>
<body>
<canvas id="canvas" width="800" height="800"></canvas>
<div id="status">Initializing...</div>
<script>
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
const W = canvas.width;
const H = canvas.height;
const CX = W / 2;
const CY = H / 2;
const RADIUS = 220;
const DOTS = 450;
const CONNECTION_DISTANCE = 55;
const MAX_CONNECTIONS = 5;
let points = [];
let projected = [];
let time = 0;
// Generate sphere points
for (let i = 0; i < DOTS; i++) {
const theta = Math.random() * Math.PI * 2;
const phi = Math.acos((Math.random() * 2) - 1);
points.push({
theta,
phi,
basePhi: phi
});
}
// Fake AI messages
const messages = [
"Analyzing context...",
"Searching vector space...",
"Optimizing response...",
"Aligning probabilities...",
"Resolving ambiguity...",
"Synthesizing output..."
];
let msgIndex = 0;
setInterval(() => {
msgIndex = (msgIndex + 1) % messages.length;
document.getElementById("status").textContent = messages[msgIndex];
}, 2000);
// Rotation helpers
function rotateY(x, z, angle) {
return {
x: x * Math.cos(angle) - z * Math.sin(angle),
z: x * Math.sin(angle) + z * Math.cos(angle)
};
}
function rotateX(y, z, angle) {
return {
y: y * Math.cos(angle) - z * Math.sin(angle),
z: y * Math.sin(angle) + z * Math.cos(angle)
};
}
function draw() {
ctx.clearRect(0, 0, W, H);
time += 0.01;
projected = [];
// Project points
points.forEach(p => {
let wave = Math.sin(time * 2 + p.basePhi * 6) * 0.2;
let phi = p.basePhi + wave;
let x = RADIUS * Math.sin(phi) * Math.cos(p.theta + time * 0.3);
let y = RADIUS * Math.sin(phi) * Math.sin(p.theta + time * 0.3);
let z = RADIUS * Math.cos(phi);
let ry = rotateY(x, z, time * 0.4);
x = ry.x;
z = ry.z;
let rx = rotateX(y, z, time * 0.3);
y = rx.y;
z = rx.z;
let scale = 400 / (400 + z);
let px = CX + x * scale;
let py = CY + y * scale;
let alpha = (z + RADIUS) / (2 * RADIUS);
projected.push({ x: px, y: py, z, alpha, scale });
});
// Draw connections
for (let i = 0; i < projected.length; i++) {
let connections = 0;
for (let j = i + 1; j < projected.length; j++) {
if (connections > MAX_CONNECTIONS) break;
let dx = projected[i].x - projected[j].x;
let dy = projected[i].y - projected[j].y;
let dist = Math.sqrt(dx * dx + dy * dy);
if (dist < CONNECTION_DISTANCE) {
let alpha = 1 - dist / CONNECTION_DISTANCE;
let depth = (projected[i].alpha + projected[j].alpha) / 2;
ctx.beginPath();
ctx.moveTo(projected[i].x, projected[i].y);
ctx.lineTo(projected[j].x, projected[j].y);
ctx.strokeStyle = `rgba(0, 200, 255, ${alpha * depth * 0.6})`;
ctx.lineWidth = 0.5;
ctx.stroke();
connections++;
}
}
}
// Draw points
projected.forEach(p => {
ctx.beginPath();
ctx.arc(p.x, p.y, 2 * p.scale, 0, Math.PI * 2);
ctx.fillStyle = `rgba(0, 200, 255, ${p.alpha})`;
ctx.fill();
});
requestAnimationFrame(draw);
}
draw();
</script>
</body>
</html>1
1
4KB
4KB
210.0ms
216.0ms
210.0ms