Losowe prostokąty - efekt przejścia między obrazami w 15 liniach czystego JavaScript


Kolejny fajny i łatwy programik: wprowadzenie obrazu przy pomocy losowych prostokątów!

Działa to w następujący sposób (kod źródłowy poniżej):

[Linie 1-4] Ustaw HTML5 Canvas
[5-6] obraz źródłowy
[7-8] weź 2d context naszego płótna (Canvas)
[9] wymiary prostokąta
[10] liczba rzędów i kolumn losowych prostokątów
[12] kiedy obraz zostanie wgrany:
[13-14] oblicz szerokość i wysokość prostokątów
[15] rozpocznij animację!
[18-23] Główna funkcja animacji:
[19-20] wylosuj prostokąt
[21] Oto najważniejsza część naszego rozwiązania:
Kopiujemy prostokątną bitmapę, o wymiarach boxWidth x boxHeight i współrzędnych (x * boxWidth, y * boxHeight) z image do Canvas.


<html>
<body>
<canvas id="myCanvaswidth="600height="373"></canvas>
<script>
let image = new Image();
image.src = "example1.jpg";
let canvas = document.getElementById("myCanvas");
let context = canvas.getContext("2d");
let boxWidthboxHeight;
let rows = 10columns = 20;
 
image.onload = function() {
  boxWidth = image.width / columns;
  boxHeight = image.height / rows;
  requestAnimationFrame(animate);
};
 
function animate() {
  let x = Math.floor(Math.random() * columns);
  let y = Math.floor(Math.random() * rows);
  context.drawImage(imagex * boxWidthy * boxHeightboxWidthboxHeightx * boxWidthy * boxHeightboxWidthboxHeight);
  requestAnimationFrame(animate);
}
</script>
</body>
</html>



Ten program działa w nieskończoność i po prostu wciąż kopiuje prostokąty, które zostały już skopiowane.

Oto ciekawsza wersja, która przełącza dwa obrazy:

Aby to osiągnąć, musimy wprowadzić licznik - counter [13], który będzie zwiększany po każdej ramce animacji [26].
[27-28] Jeżeli licznik osiągnie wartość 500, wyświetl cały obraz. Dzięki temu unikamy sytuacji, gdzie zostały do narysowania 2 lub 3 prostokąty, lecz komputer wciąż losuje inne.
[30-35] Po kolejnych stu ramkach, zamieniamy obraz źródłowy i resetujemy licznik.

<html>
<body>
<canvas id="myCanvaswidth="600height="373"></canvas>
<script>
let image = new Image();
image.src = "example0.jpg";
let image2 = new Image();
image2.src = "example1.jpg";
 
let canvas = document.getElementById("myCanvas");
let context = canvas.getContext("2d");
let boxWidthboxHeight;
let rows = 10columns = 20counter = 0;
let source = image;
 
image2.onload = function() {
  boxWidth = image.width / columns;
  boxHeight = image.height / rows;
  requestAnimationFrame(animate);
};
 
function animate() {
  let x = Math.floor(Math.random() * columns);
  let y = Math.floor(Math.random() * rows);
  context.drawImage(sourcex * boxWidthy * boxHeightboxWidthboxHeightx * boxWidthy * boxHeightboxWidthboxHeight);
  counter++;
  if (counter == 500)
    context.drawImage(source00);
  requestAnimationFrame(animate);
  if (counter == 600) {
    if (source == image)
      source = image2;
    else
      source = image;
    counter = 0;
  }
}
</script>
</body>
</html>



Inne samouczki:

Fraktale - 25 linii JavaScript

Złudzenie optyczne - 18 linii

Sinus scroll - 30 linii

Gra "Angry Chickens"

Animowane krzywe kwadratowe - 50 linii

Eksperyment z enginem fizyki


Rozbiajanie muru kulą - 14 linii Python/Blender 3d


Efekt domino - 10 linii Python/Blender 3d


English version of this page