2012-07-04 12 views
11

Estoy haciendo gráficos alrededor de un centro X, Y de 0,0. Cuando es hora de renderizar, cambio de posición con la traducción, y luego uso la escala para hacer que el gráfico llene el lienzo (es decir, escalar todo en un 50%, por ejemplo).Comprensión de HTML 5 escala de lienzo y orden de traducción

Me di cuenta de que importa si llamas a scale y luego traduces, traduces y luego escalas y no puedo entenderlo. Esto es un problema ya que no todo encaja, pero mi modelo mental no está completo, por lo que es difícil solucionarlo.

¿Alguien puede explicar por qué el orden de la escala y las llamadas de traducción importan?

Respuesta

16

Así que vamos a dibujar una cuadrícula en un lienzo de 300x300:

http://jsfiddle.net/simonsarris/4uaZy/

enter image description here

Esto va a hacer. Nada especial. Una línea roja indica dónde se encuentra el origen al atravesar (0,0) y extenderse muy, así que cuando lo traduzcamos veremos algo. El origen aquí es la esquina superior izquierda, donde las líneas rojas se encuentran en (0,0).

Todas las traducciones a continuación ocurren antes de dibujar la cuadrícula, por lo que vamos a mover la cuadrícula. Esto le permite ver exactamente qué está sucediendo con la organización.


por lo que permite traducir el lienzo de 100.100, moviéndolo hacia abajo + derecha:

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/1/

así que hemos traducido al origen, que es donde la X roja es centrado. El origen ahora está en 100,100.


Ahora vamos a traducir y luego escalar. Observe cómo el origen está en el mismo lugar que la última imagen, todo es dos veces más grande.

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/2/

Boom. El orgin está todavía en 100,100. Todo está hinchado por 2 sin embargo. El origen cambió, luego todo se hincha en su lugar.


Ahora vamos a verlos en sentido inverso.Esta vez primera escala, así que todo es grasa desde el principio:

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/3/

Todo se hinchó por 2. El origen está en 0,0, su punto de partida.


Ahora hacemos una escala y luego traducimos.

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/4/

Estamos traduciendo por 100.100 todavía, pero el origen se ha movido por 200.200 en píxeles reales. Compare esto con dos imágenes anteriores.

Esto es porque todo lo que sucede después de una escala debe escalarse, incluidas las transformaciones adicionales. Por lo tanto la transformación de (100.100) sobre un lienzo reducido conduce a que se mueva por 200, 200.


Lo llevar a recordar aquí es que el cambio de la transformación afecta a cómo se dibujan las cosas (o se transforman!) A partir de entonces . Si se cambia la escala x2, y luego traducir, la traducción será x2

Si usted quiere ver, matemáticamente, lo que está sucediendo en cada paso le animo a echar un vistazo al código aquí:

https://github.com/simonsarris/Canvas-tutorials/blob/master/transform.js

Esto imita todo el proceso de transformación realizado por lienzo y le permite ver cómo las transformaciones previas modifican las que vienen después.

+0

Excelente explicación. Parece tan obvio ahora :) – DougN

+0

Bueno, algo todavía no tiene sentido. Mira esto: http://jsfiddle.net/sdJ7v/1/ La prueba y el error me ayudaron a centrar el círculo azul dentro del verde. Pero dadas las coordenadas, esa compensación no tiene sentido. No estoy seguro de cómo se está aplicando la transformación ... – DougN

+1

vea mis comentarios aquí: http://jsfiddle.net/simonsarris/sdJ7v/2/ ¿Tiene sentido? –

2

La escala y la rotación se realizan con respecto al origen, por lo que si su transformación tiene una traducción, por ejemplo, esto hará que la orden sea importante.

Heres una buena lectura: Why Transformation Order Is Significant

+0

Vaya, dije transformar cuando me refería a translate. Fijo. Leí el artículo, pero todavía no lo entiendo. ¿Qué significa que "escalar se hace con respecto al origen"? ¿Por qué importa si escalo todo en un 50% donde está el origen? – DougN

+1

@DougN Es importante porque si las cosas se encogen o crecen, se encogen o crecen alrededor de un único punto en el avión. Si ese punto está centrado en su lienzo, la escala del 50% es como "unzoom". Si está arriba a la izquierda, todo en el lienzo se moverá un 50% más cerca de ese punto. Si está fuera de la región visible, todo lo que estás mirando puede moverse fuera de la pantalla a medida que viaja un 50% más cerca de ese punto. Para decirlo de otra manera, solo el píxel de origen tiene una escala pura, mientras que el resto se contrae * y * se traduce en relación con su posición inicial. –

Cuestiones relacionadas