Transform

 

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

 

 

I sei parametri della funzione transform(a, b, c, d, e, f) hanno nella tabella di cui sopra una spiegazione.

L'unico aspetto da evidenziare è che le trasformazioni si applicano a tutto il canvas e non alla figura (rettangolo). Questo comporta che se ad es. applichiamo una scala orizzontale di 1.5 tutto il canvas si espanderà in orizzontale di una volta e mezza, di conseguenza anche il margine sinistro del rettangolo crescerà di 1.5. Questo sembrerà come se il rettangolo abbia subito oltre alla scala anche una traslazione. Per cui se si vuole mantenere lo stesso margine bisognerà effettuare una correzione.

trans.html:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6     <title>Canvas Transform Parameters</title>
  7     <style>
  8         body {
  9             display: flex;
 10             flex-direction: column;
 11             align-items: center;
 12             margin: 0;
 13             font-family: Arial, sans-serif;
 14         }
 15         table {
 16             margin: 20px;
 17             border-collapse: collapse;
 18         }
 19         table, th, td {
 20             border: 1px solid black;
 21         }
 22         th, td {
 23             padding: 10px;
 24             text-align: center;
 25         }
 26         canvas {
 27             margin: 10px 0;
 28             border: 1px solid black;
 29         }
 30     </style>
 31 </head>
 32 <body>
 33     <table>
 34         <thead>
 35             <tr>
 36                 <th>Lettera</th>
 37                 <th>Tipo</th>
 38                 <th>Esempio</th>
 39                 <th>Parametri</th>
 40             </tr>
 41         </thead>
 42         <tbody>
 43             <tr>
 44                 <td>N/A</td>
 45                 <td>Nessuna Trasformazione</td>
 46                 <td>
 47                     <canvas id="exampleOriginal" width="200" height="100"></canvas>
 48                 </td>
 49                 <td>transform(1, 0, 0, 1, 0, 0)</td>
 50             </tr>
 51             <tr>
 52                 <td>a</td>
 53                 <td>Scala orizzontale</td>
 54                 <td>
 55                     <canvas id="example1" width="200" height="100"></canvas>
 56                 </td>
 57                 <td>transform(1.5, 0, 0, 1, 0, 0)</td>
 58             </tr>
 59             <tr>
 60                 <td>b</td>
 61                 <td>Inclinazione orizzontale</td>
 62                 <td>
 63                     <canvas id="example2" width="200" height="100"></canvas>
 64                 </td>
 65                 <td>transform(1, 0.5, 0, 1, 0, 0)</td>
 66             </tr>
 67             <tr>
 68                 <td>c</td>
 69                 <td>Inclinazione verticale</td>
 70                 <td>
 71                     <canvas id="example3" width="200" height="100"></canvas>
 72                 </td>
 73                 <td>transform(1, 0, 0.5, 1, 0, 0)</td>
 74             </tr>
 75             <tr>
 76                 <td>d</td>
 77                 <td>Scala verticale</td>
 78                 <td>
 79                     <canvas id="example4" width="200" height="100"></canvas>
 80                 </td>
 81                 <td>transform(1, 0, 0, 1.5, 0, 0)</td>
 82             </tr>
 83             <tr>
 84                 <td>e</td>
 85                 <td>Traslazione orizzontale</td>
 86                 <td>
 87                     <canvas id="example5" width="200" height="100"></canvas>
 88                 </td>
 89                 <td>transform(1, 0, 0, 1, 50, 0)</td>
 90             </tr>
 91             <tr>
 92                 <td>f</td>
 93                 <td>Traslazione verticale</td>
 94                 <td>
 95                     <canvas id="example6" width="200" height="100"></canvas>
 96                 </td>
 97                 <td>transform(1, 0, 0, 1, 0, 50)</td>
 98             </tr>
 99         </tbody>
100     </table>
101 
102     <script>
103         function drawExample(canvasId, transformParams) {
104             var canvas = document.getElementById(canvasId);
105             var ctx = canvas.getContext('2d');
106 
107             // Colore di riempimento
108             ctx.fillStyle = 'blue';
109 
110             // Salva lo stato corrente del contesto
111             ctx.save();
112 
113             // Applica la trasformazione
114             ctx.transform(...transformParams);
115 
116             // Disegna un rettangolo alla posizione (50, 25) con dimensioni 100x50
117             ctx.fillRect(50, 25, 100, 50);
118 
119             // Ripristina lo stato del contesto
120             ctx.restore();
121         }
122 
123         // Esempio originale senza trasformazioni
124         drawExample('exampleOriginal', [1, 0, 0, 1, 0, 0]); // Nessuna trasformazione
125 
126         // Esempi di trasformazione
127         drawExample('example1', [1.5, 0, 0, 1, 0, 0]); // Scala orizzontale
128         drawExample('example2', [1, 0.5, 0, 1, 0, 0]); // Inclinazione orizzontale
129 
130         drawExample('example3', [1, 0, 0.5, 1, 0, 0]); // Inclinazione verticale
131         drawExample('example4', [1, 0, 0, 1.5, 0, 0]); // Scala verticale
132         drawExample('example5', [1, 0, 0, 1, 50, 0]); // Traslazione orizzontale
133         drawExample('example6', [1, 0, 0, 1, 0, 50]); // Traslazione verticale
134     </script>
135 </body>
136 </html>

 

L'unica linea da spiegare è la 114:

 

ctx.transform(...transformParams);

 

I puntini che vedi nella linea ctx.transform(...transformParams); rappresentano l'operatore di spread in JavaScript. Questo operatore consente di espandere un array o un oggetto in singoli elementi.

Come funziona l'operatore di spread

L'operatore di spread ... prende un array e lo "espande" in singoli elementi. Nel contesto della funzione ctx.transform(...), l'array transformParams viene scomposto nei suoi elementi costitutivi.

Esempio senza operatore di spread

Supponiamo di avere l'array transformParams con i seguenti valori:

let transformParams = [1, 0.5, 0, 1, 0, 0];

 

Senza l'operatore di spread, dovresti passare ogni elemento dell'array come argomento separato alla funzione transform:

ctx.transform(transformParams[0], transformParams[1], transformParams[2], transformParams[3], transformParams[4], transformParams[5]);

 

Utilizzo dell'operatore di spread

Con l'operatore di spread, puoi fare la stessa cosa in modo molto più conciso:

ctx.transform(...transformParams);

 

Questa sintassi è equivalente a scrivere:

 

ctx.transform(1, 0.5, 0, 1, 0, 0);

 

Vantaggi dell'operatore di spread

  • Conciso: Riduce il codice necessario per passare gli elementi di un array come argomenti separati.
  • Leggibile: Migliora la leggibilità del codice eliminando la necessità di indicizzare manualmente l'array.
  • Flessibile: Permette di passare array di dimensioni variabili senza dover modificare il codice della funzione.

Applicazione nel tuo codice

Nel contesto del tuo codice, l'uso dell'operatore di spread rende la funzione drawExample più generica e pulita. Ecco come appare:

 

function drawExample(canvasId, transformParams) {

var canvas = document.getElementById(canvasId);

var ctx = canvas.getContext('2d');

// Colore di riempimento ctx.fillStyle = 'blue';

// Salva lo stato corrente del contesto ctx.save();

// Applica la trasformazione ctx.transform(...transformParams);

// Disegna un rettangolo alla posizione (50, 25) con dimensioni 100x50 ctx.fillRect(50, 25, 100, 50);

// Ripristina lo stato del contesto ctx.restore();

}

 

Conclusione

L'operatore di spread è una caratteristica potente e flessibile di JavaScript che semplifica il passaggio di array e oggetti nelle funzioni, migliorando la leggibilità e la manutenibilità del codice.

 

CopiQui