MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Transformări

Elementul canvas suportă transformări ale figurilor, incluzând deplasarea, rotația și scalarea.

Deplasarea

Deplasarea se realizează utilizând metoda translate():

translate(x, y)

Primul parametru indică deplasarea pe axa X, iar al doilea parametru - deplasarea pe axa Y.

Exemplu de utilizare pentru deplasare:

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <title>FDC.COM</title>
</head>
<body>
<canvas id="canvas" width="400" height="250"></canvas>
<script>
const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(50, 50, 100, 100);

context.globalAlpha = 0.5; // setăm transparența pentru suprapunere
context.fillStyle = "red";
context.translate(50, 25); // deplasăm la 50 pixeli la dreapta și 25 pixeli în jos
context.fillRect(50, 50, 100, 100);
</script>
</body>
</html>

Aici, pe aceeași poziție sunt desenate două dreptunghiuri egale: unul albastru și altul roșu. Totuși, dreptunghiului roșu i se aplică o transformare de deplasare:

Rotația

Rotația figurilor pe canvas se efectuează folosind metoda rotate():

rotate(angle)

Unghiul de rotație este specificat în radiani, relativ la punctul cu coordonatele (0, 0).

Exemplu de utilizare pentru rotație:

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(50, 20, 100, 100);

context.globalAlpha = 0.5;
context.fillStyle = "red";
context.rotate(.52);    // rotim cu 0.52 radiani sau aproximativ 30 de grade
context.fillRect(50, 20, 100, 100);

Scalarea

Scalarea se realizează folosind metoda scale():

scale(xScale, yScale)

Parametrul xScale indică scalarea pe axa X, iar yScale - scalarea pe axa Y.

Exemplu de utilizare pentru scalare:

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(0, 0, 100, 100);

context.globalAlpha = 0.5;
context.fillStyle = "red";
context.scale(1.5, 1.5); // mărim pe lățime de 1.5 ori și pe înălțime de 1.5 ori
context.fillRect(0, 0, 100, 100);

Matricea de transformare

Cand este necesar, putem aplica mai multe transformari in succesiune:

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(0, 0, 100, 100);
             
context.globalAlpha = 0.5;
context.fillStyle = "red";
context.scale(1.5, 1.5);
context.translate(100, 10);
context.rotate(0.34);
context.fillRect(0, 0, 100, 100);

Contextul elementului canvas ofera de asemenea metoda transform(), care permite setarea unei matrice de transformare:

transform(a, b, c, d, e, f)

Toti parametrii acestei metode reprezinta secvential elementele matricei de transformare, unde:

  • a este scalarea pe axa X
  • b este rotatia in jurul axei X
  • c este rotatia in jurul axei Y
  • d este scalarea pe axa Y
  • e este deplasarea orizontala
  • f este deplasarea verticala

Exemplu de utilizare:

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(100, 30, 100, 100);
             
context.globalAlpha = 0.5;
context.fillStyle = "red";
// aplicam transformarile
context.transform(  
   Math.cos(Math.PI/6), Math.sin(Math.PI/6), -1 * Math.sin(Math.PI/6),
   Math.cos(Math.PI/6), 0, 0);
context.fillRect(100, 30, 100, 100);

Înlocuirea transformării

Când se aplică diferite transformări în mod secvențial, acestea sunt aplicate pur și simplu în ordine figurilor. Totuși, poate apărea o situație în care este necesar să aplicăm o transformare nu împreună cu altele, ci în locul altora, adică să înlocuim transformarea. Pentru aceasta se utilizează metoda setTransform():

setTransform(a, b, c, d, e, f)

Parametrii săi reprezintă matricea de transformare, iar utilizarea sa este similară cu cea a metodei transform(). De exemplu:

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");
let k = 0;
for (let x = 0; x < 30; x++) {
   k = Math.floor(255 / 34 * x);
   context.fillStyle = "rgb(" + k + "," + k + "," + k + ")";
   context.fillRect(50, 50, 200, 100);
   context.setTransform(1, 0, 0, 1, x, x);
}

Resetarea transformărilor

Când se aplică transformări, toate figurile desenate ulterior sunt supuse acestor transformări. Dar poate exista o situație în care, după o singură aplicare a transformării, nu mai avem nevoie de ea. Pentru toate desenele ulterioare, putem reseta transformările utilizând metoda resetTransform():

const canvas = document.getElementById("canvas");
const context = canvas.getContext("2d");

context.fillStyle = "blue";
context.fillRect(100, 10, 100, 100);

context.globalAlpha = 0.5;
context.fillStyle = "red";
context.translate(50, 25);
// se aplică transformarea
context.fillRect(100, 10, 100, 100);

context.fillStyle = "green";
context.resetTransform();
// transformarea nu mai este aplicată
context.fillRect(0, 10, 100, 100);
← Lecția anterioară Lecția următoare →