Ver Mensaje Individual
  #4 (permalink)  
Antiguo 10/06/2009, 08:18
Avatar de TIaGoX
TIaGoX
 
Fecha de Ingreso: julio-2008
Ubicación: Loma Hermosa @ Buenos Aires
Mensajes: 49
Antigüedad: 15 años, 9 meses
Puntos: 2
Respuesta: Rotar imagen desde un punto

Mira yo en base a ese código que pusiste una vez desarrolle unos relojitos similares a lo que necesitas. Y cree este método para transladar la imagen una vez rotada. Pensá que esta hecho como el método de una clase, por el nombre de las variable estimo que te darás cuenta de lo que son cada una de las mismas.
Código javascript:
Ver original
  1. /** El centro de rotación de canvas es el vértice superior izquierdo, por
  2.  * ello, este método se ocupa de calcular cuando debemos trasladar la
  3.  * imagen para que parezca que rota sobre el centro de la imagen.
  4.  * @param ctx, el objeto context.
  5.  * @param rotacion, el ángulo de rotación de la imagen en radianes.
  6.  */
  7. Meter.prototype.getTranslateAfterRotate = function(ctx,rotacion){
  8.     /* En base al angulo de rotación muevo la imagen a una nueva posicion
  9.      * dentro del lienzo para que quede centrada al momento de ser dibujada.
  10.      */
  11.     var hipotenusa = sqrt(pow2(this.meterWidth/2) + pow2(this.meterHeight/2));
  12.     var desplazamientoX;
  13.     var desplazamientoY;
  14.     /* Si el angulo esta en el primer cuadrante de la rotacion, tomamos el
  15.      * desplazamiento del centro por medio de la hipotenusa que es la semi
  16.      * diagonal de la imagen y el angulo de rotacion mas los 45º de angulo de
  17.      * la diagonal. Lo mismo con los demas cuadrantes. Para mas informacion
  18.      * de como interpretar esto se adjuntara la documentacion correspondiente.
  19.      */
  20.     if (rotacion <= PI/2) {
  21.         desplazamientoX = hipotenusa * coseno(rotacion+(PI/4));
  22.         desplazamientoY = hipotenusa * seno(rotacion+(PI/4));
  23.         ctx.translate(((this.meterWidth/2)-desplazamientoX)+xCentro,
  24.             ((this.meterHeight/2)-desplazamientoY)+yCentro);
  25.     } else if (rotacion <= PI) {
  26.         desplazamientoX = hipotenusa * seno(rotacion-(PI/4));
  27.         desplazamientoY = hipotenusa * coseno(rotacion-(PI/4));
  28.         ctx.translate(((this.meterWidth/2)+desplazamientoX)+xCentro,
  29.             ((this.meterHeight/2)-desplazamientoY)+yCentro);
  30.     } else if (rotacion <= 1.5 * PI) {
  31.         desplazamientoX = hipotenusa * (coseno(rotacion-(0.75 * PI)));
  32.         desplazamientoY = hipotenusa * (seno(rotacion-(0.75 * PI)));
  33.         ctx.translate(((this.meterWidth/2)+desplazamientoX)+xCentro,
  34.             ((this.meterHeight/2)+desplazamientoY)+yCentro);
  35.     } else {
  36.         desplazamientoX = hipotenusa * (coseno((1.75 * PI)-rotacion));
  37.         desplazamientoY = hipotenusa * (seno((1.75 * PI)-rotacion));
  38.         ctx.translate(((this.meterWidth/2)-desplazamientoX)+xCentro,
  39.             ((this.meterHeight/2)+desplazamientoY)+yCentro);
  40.     }
  41.     return ctx;
  42. }
Espero que se entienda y te sirva. Cualquier cosa trato de responder tus consultas.

Saludos!