<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.h4ks.com/index.php?action=history&amp;feed=atom&amp;title=Bouncing_Rainbow_Balls</id>
	<title>Bouncing Rainbow Balls - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.h4ks.com/index.php?action=history&amp;feed=atom&amp;title=Bouncing_Rainbow_Balls"/>
	<link rel="alternate" type="text/html" href="https://wiki.h4ks.com/index.php?title=Bouncing_Rainbow_Balls&amp;action=history"/>
	<updated>2026-04-27T21:14:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.h4ks.com/index.php?title=Bouncing_Rainbow_Balls&amp;diff=873&amp;oldid=prev</id>
		<title>Mattf: Edited by CloudBot agent</title>
		<link rel="alternate" type="text/html" href="https://wiki.h4ks.com/index.php?title=Bouncing_Rainbow_Balls&amp;diff=873&amp;oldid=prev"/>
		<updated>2026-04-27T17:03:45Z</updated>

		<summary type="html">&lt;p&gt;Edited by CloudBot agent&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;position:relative;width:100%;height:500px;border:2px solid #ff00ff;border-radius:12px;overflow:hidden;background:#111;margin:1em 0;&amp;quot; id=&amp;quot;ballCanvas&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;addBalls(10)&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#ff6b6b,#ffa500);color:#fff;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;+10 Balls&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;addBalls(50)&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#00ff88,#00ccff);color:#000;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;+50 Balls&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;addBalls(200)&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#8b5cf6,#ec4899);color:#fff;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;+200 Balls 💀&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;clearBalls()&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#333,#555);color:#fff;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;Clear&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;toggleGravity()&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#ffd700,#ff8c00);color:#000;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;Toggle Gravity 🌍&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;explodeBalls()&amp;quot; style=&amp;quot;padding:8px 20px;margin:4px;border:none;border-radius:20px;background:linear-gradient(135deg,#ff0000,#ff4444);color:#fff;font-size:1em;cursor:pointer;font-weight:bold;&amp;quot;&amp;gt;💥 EXPLODE 💥&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p style=&amp;quot;text-align:center;color:#888;&amp;quot;&amp;gt;Balls: &amp;lt;span id=&amp;quot;ballCount&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt; | FPS: &amp;lt;span id=&amp;quot;fpsCount&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function(){&lt;br /&gt;
var canvas = document.getElementById(&amp;#039;ballCanvas&amp;#039;);&lt;br /&gt;
var balls = [];&lt;br /&gt;
var gravity = false;&lt;br /&gt;
var hue = 0;&lt;br /&gt;
var running = false;&lt;br /&gt;
var lastTime = performance.now();&lt;br /&gt;
var frameCount = 0;&lt;br /&gt;
var fps = 0;&lt;br /&gt;
&lt;br /&gt;
function resize() {&lt;br /&gt;
  canvas.style.width = &amp;#039;100%&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
resize();&lt;br /&gt;
window.addEventListener(&amp;#039;resize&amp;#039;, resize);&lt;br /&gt;
&lt;br /&gt;
function createBall(x, y, vx, vy) {&lt;br /&gt;
  var w = canvas.offsetWidth;&lt;br /&gt;
  var h = canvas.offsetHeight;&lt;br /&gt;
  var r = 8 + Math.random() * 20;&lt;br /&gt;
  hue = (hue + 17) % 360;&lt;br /&gt;
  var ball = document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
  ball.style.cssText = &amp;#039;position:absolute;border-radius:50%;pointer-events:none;box-shadow:0 0 15px currentColor,inset 0 -5px 15px rgba(0,0,0,0.3),inset 0 5px 15px rgba(255,255,255,0.3);&amp;#039;;&lt;br /&gt;
  ball.style.width = r*2 + &amp;#039;px&amp;#039;;&lt;br /&gt;
  ball.style.height = r*2 + &amp;#039;px&amp;#039;;&lt;br /&gt;
  ball.style.background = &amp;#039;radial-gradient(circle at 35% 35%, hsl(&amp;#039; + hue + &amp;#039;,100%,80%), hsl(&amp;#039; + hue + &amp;#039;,100%,50%))&amp;#039;;&lt;br /&gt;
  ball.style.color = &amp;#039;hsl(&amp;#039; + hue + &amp;#039;,100%,60%)&amp;#039;;&lt;br /&gt;
  canvas.appendChild(ball);&lt;br /&gt;
  balls.push({&lt;br /&gt;
    el: ball, x: x || Math.random()*(w-r*2)+r, y: y || Math.random()*(h-r*2)+r,&lt;br /&gt;
    vx: vx !== undefined ? vx : (Math.random()-0.5)*8, vy: vy !== undefined ? vy : (Math.random()-0.5)*8,&lt;br /&gt;
    r: r, hue: hue&lt;br /&gt;
  });&lt;br /&gt;
  updateCount();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function updateCount() {&lt;br /&gt;
  var el = document.getElementById(&amp;#039;ballCount&amp;#039;);&lt;br /&gt;
  if (el) el.textContent = balls.length;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function tick() {&lt;br /&gt;
  var w = canvas.offsetWidth;&lt;br /&gt;
  var h = canvas.offsetHeight;&lt;br /&gt;
  for (var i = 0; i &amp;lt; balls.length; i++) {&lt;br /&gt;
    var b = balls[i];&lt;br /&gt;
    if (gravity) b.vy += 0.3;&lt;br /&gt;
    b.x += b.vx;&lt;br /&gt;
    b.y += b.vy;&lt;br /&gt;
    if (b.x - b.r &amp;lt; 0) { b.x = b.r; b.vx = Math.abs(b.vx) * 0.95; }&lt;br /&gt;
    if (b.x + b.r &amp;gt; w) { b.x = w - b.r; b.vx = -Math.abs(b.vx) * 0.95; }&lt;br /&gt;
    if (b.y - b.r &amp;lt; 0) { b.y = b.r; b.vy = Math.abs(b.vy) * 0.95; }&lt;br /&gt;
    if (b.y + b.r &amp;gt; h) { b.y = h - b.r; b.vy = -Math.abs(b.vy) * 0.95; }&lt;br /&gt;
    b.el.style.transform = &amp;#039;translate(&amp;#039; + (b.x - b.r) + &amp;#039;px,&amp;#039; + (b.y - b.r) + &amp;#039;px)&amp;#039;;&lt;br /&gt;
  }&lt;br /&gt;
  frameCount++;&lt;br /&gt;
  var now = performance.now();&lt;br /&gt;
  if (now - lastTime &amp;gt;= 1000) {&lt;br /&gt;
    fps = frameCount;&lt;br /&gt;
    frameCount = 0;&lt;br /&gt;
    lastTime = now;&lt;br /&gt;
    var fEl = document.getElementById(&amp;#039;fpsCount&amp;#039;);&lt;br /&gt;
    if (fEl) fEl.textContent = fps;&lt;br /&gt;
  }&lt;br /&gt;
  requestAnimationFrame(tick);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
window.addBalls = function(n) {&lt;br /&gt;
  for (var i = 0; i &amp;lt; n; i++) createBall();&lt;br /&gt;
  if (!running) { running = true; tick(); }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
window.clearBalls = function() {&lt;br /&gt;
  for (var i = 0; i &amp;lt; balls.length; i++) balls[i].el.remove();&lt;br /&gt;
  balls = [];&lt;br /&gt;
  updateCount();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
window.toggleGravity = function() { gravity = !gravity; };&lt;br /&gt;
&lt;br /&gt;
window.explodeBalls = function() {&lt;br /&gt;
  for (var i = 0; i &amp;lt; balls.length; i++) {&lt;br /&gt;
    var angle = Math.random() * Math.PI * 2;&lt;br /&gt;
    var speed = 10 + Math.random() * 20;&lt;br /&gt;
    balls[i].vx = Math.cos(angle) * speed;&lt;br /&gt;
    balls[i].vy = Math.sin(angle) * speed;&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
addBalls(20);&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== About ==&lt;br /&gt;
This page is a celebration of &amp;#039;&amp;#039;&amp;#039;bouncing rainbow balls&amp;#039;&amp;#039;&amp;#039;. They bounce. They are rainbow. They are balls. What more do you want?&lt;br /&gt;
&lt;br /&gt;
=== History ===&lt;br /&gt;
* Balls have been bouncing since the dawn of time&lt;br /&gt;
* Rainbows were invented by Sir Isaac Newton while staring at a prism&lt;br /&gt;
* Someone combined the two concepts and &amp;#039;&amp;#039;&amp;#039;this wiki page was born&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Fun Facts ===&lt;br /&gt;
* Adding 200 balls at once may cause your browser to have a &amp;#039;&amp;#039;&amp;#039;spiritual experience&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Toggling gravity makes the balls obey the &amp;#039;&amp;#039;&amp;#039;laws of Ohio&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* The explode button exists because &amp;#039;&amp;#039;&amp;#039;violence is always the answer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Each ball has a unique hue because we believe in &amp;#039;&amp;#039;&amp;#039;ball diversity&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Controls ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:#ff6b6b&amp;quot;&amp;gt;+10 Balls&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039; - Add a reasonable amount of balls&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:#00ff88&amp;quot;&amp;gt;+50 Balls&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039; - Things are getting spicy&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:#a78bfa&amp;quot;&amp;gt;+200 Balls 💀&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039; - Enter the brainrot zone&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Clear&amp;#039;&amp;#039;&amp;#039; - When you&amp;#039;ve had enough of this goofy ahh simulation&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Toggle Gravity 🌍&amp;#039;&amp;#039;&amp;#039; - Make Isaac Newton proud (or roll in his grave)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;💥 EXPLODE 💥&amp;#039;&amp;#039;&amp;#039; - Send them to the shadow realm&lt;br /&gt;
&lt;br /&gt;
[[Category:Interactive]] [[Category:Brainrot]] [[Category:Balls]]&lt;/div&gt;</summary>
		<author><name>Mattf</name></author>
	</entry>
</feed>