Plasma effect: Difference between revisions
Content added Content deleted
(Added ASCII and Graphics implementations in C.) |
(→{{header|JavaScript}}: added javascript) |
||
Line 679: | Line 679: | ||
} |
} |
||
}</lang> |
}</lang> |
||
=={{header|JavaScript}}== |
|||
{{trans|Java}} |
|||
<lang javascript><!DOCTYPE html> |
|||
<html lang='en'> |
|||
<head> |
|||
<meta charset='UTF-8'> |
|||
<style> |
|||
canvas { |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
width: 700px; |
|||
height: 500px; |
|||
margin: -250px 0 0 -350px; |
|||
} |
|||
body { |
|||
background-color: black; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<canvas></canvas> |
|||
<script> |
|||
'use strict'; |
|||
var canvas = document.querySelector('canvas'); |
|||
canvas.width = 700; |
|||
canvas.height = 500; |
|||
var g = canvas.getContext('2d'); |
|||
var plasma = createPlasma(canvas.width, canvas.height); |
|||
var hueShift = 0; |
|||
function createPlasma(w, h) { |
|||
var buffer = new Array(h); |
|||
for (var y = 0; y < h; y++) { |
|||
buffer[y] = new Array(w); |
|||
for (var x = 0; x < w; x++) { |
|||
var value = Math.sin(x / 16.0); |
|||
value += Math.sin(y / 8.0); |
|||
value += Math.sin((x + y) / 16.0); |
|||
value += Math.sin(Math.sqrt(x * x + y * y) / 8.0); |
|||
value += 4; // shift range from -4 .. 4 to 0 .. 8 |
|||
value /= 8; // bring range down to 0 .. 1 |
|||
buffer[y][x] = value; |
|||
} |
|||
} |
|||
return buffer; |
|||
} |
|||
function drawPlasma(w, h) { |
|||
var img = g.getImageData(0, 0, w, h); |
|||
for (var y = 0; y < h; y++) { |
|||
for (var x = 0; x < w; x++) { |
|||
var hue = hueShift + plasma[y][x] % 1; |
|||
var rgb = HSVtoRGB(hue, 1, 1); |
|||
var pos = (y * w + x) * 4; |
|||
img.data[pos] = rgb.r; |
|||
img.data[pos + 1] = rgb.g; |
|||
img.data[pos + 2] = rgb.b; |
|||
} |
|||
} |
|||
g.putImageData(img, 0, 0); |
|||
} |
|||
// copied from stackoverflow |
|||
function HSVtoRGB(h, s, v) { |
|||
var r, g, b, i, f, p, q, t; |
|||
i = Math.floor(h * 6); |
|||
f = h * 6 - i; |
|||
p = v * (1 - s); |
|||
q = v * (1 - f * s); |
|||
t = v * (1 - (1 - f) * s); |
|||
switch (i % 6) { |
|||
case 0: r = v, g = t, b = p; break; |
|||
case 1: r = q, g = v, b = p; break; |
|||
case 2: r = p, g = v, b = t; break; |
|||
case 3: r = p, g = q, b = v; break; |
|||
case 4: r = t, g = p, b = v; break; |
|||
case 5: r = v, g = p, b = q; break; |
|||
} |
|||
return { |
|||
r: Math.round(r * 255), |
|||
g: Math.round(g * 255), |
|||
b: Math.round(b * 255) |
|||
}; |
|||
} |
|||
function drawBorder() { |
|||
g.strokeStyle = "white"; |
|||
g.lineWidth = 10; |
|||
g.strokeRect(0, 0, canvas.width, canvas.height); |
|||
} |
|||
function animate(lastFrameTime) { |
|||
var requestID = requestAnimationFrame(function () { |
|||
animate(lastFrameTime); |
|||
}); |
|||
var time = new Date().getTime(); |
|||
var delay = 42; // about 24 fps |
|||
if (lastFrameTime + delay < time) { |
|||
hueShift = (hueShift + 0.02) % 1; |
|||
drawPlasma(canvas.width, canvas.height); |
|||
drawBorder(); |
|||
lastFrameTime = time; |
|||
} |
|||
} |
|||
g.fillRect(0, 0, canvas.width, canvas.height); |
|||
animate(0); |
|||
</script> |
|||
</body> |
|||
</html></lang> |
|||
=={{header|Kotlin}}== |
=={{header|Kotlin}}== |