2011-04-14 22 views
5

He estado utilizando Affine Transform para rotar un String en mi proyecto de Java, y no soy un programador experimentado todavía, por lo que me ha tomado mucho tiempo hacer una tarea aparentemente pequeña. Para rotar un hilo.¿Cómo funciona realmente Affine Transform en Java?

Ahora finalmente he conseguido que funcione más o menos como esperaba, excepto que todavía no se ha hecho con la precisión que yo quería ...

Dado que fue un proceso de prueba y error y al leer la descripción de la transformación afín todavía no estoy muy seguro de lo que realmente hace. Lo que creo que sé por el momento es que tomo una cuerda y defino el centro de la cuerda (o el punto sobre el que quiero girar), pero ¿dónde entran las matrices? (Aparentemente no sé que jeje)

¿Alguien podría intentar y explicarme cómo funciona la transformación afín, en otras palabras, que el documento de Java? Tal vez me puede ayudar a modificar mi implementación y también me gustaría saber :)

Gracias de antemano.

+2

Esto es más una pregunta matemática que la programación. Echa un vistazo a la página de Wikipedia al respecto: http://en.wikipedia.org/wiki/Affine_transformation No es que va a ser más fácil de entender que el JavaDoc. :) Desafortunadamente es solo una de esas cosas que tienes que forzar a fuerza tu aprendizaje, en mi humilde opinión. – brindy

Respuesta

5

Para comprender qué es la transformación afín y cómo funciona, consulte la wikipedia article.

En general, es una transformación lineal (como escalar o reflejar) que se puede implementar como una multiplicación por matriz específica, y luego seguida de la traducción (movimiento) que se realiza mediante la adición de un vector. Entonces, para calcular para cada píxel [x, y] su nueva ubicación, necesita multiplicarlo por una matriz específica (hacer la transformación lineal) y luego agregar y luego agregar un vector específico (hacer la traducción).

2

En la práctica, encontré dos cosas útiles para comprender AffineTransform:

  1. puede transformar o bien un contexto gráfico, Graphics2D, o cualquier clase que implementa la interfaz Shape, como se discutió here.

  2. transformaciones concatenados tienen un aparente orden -pasado especificado por el primero-aplicado, también mencionado here.

2

Aparte de las respuestas ya dadas por otro desea mostrar un consejo práctico a saber, un patrón que por lo general se aplican cuando giratorio cadenas u otros objetos:

  1. mover el punto de rotación (x, y) al origen del espacio aplicando translate(-x,-y).
  2. hacer la rotación rotate(angle) (posible también la ampliación se hará aquí)
  3. mover todo de vuelta al punto original de translate(x,y).

Recuerde que usted tiene que aplicar estos pasos en orden inverso (véase la respuesta de trashgod).

Para cadenas con la primera traducción normalmente muevo el centro del cuadro delimitador al origen y con la última traducción muevo la cuerda al punto real en la pantalla donde debería aparecer el centro. Entonces simplemente puedo dibujar la cuerda en cualquier posición que me guste.

Rectangle2D r = g.getFontMetrics().getStringBounds(text, g); 
g.translate(final_x, final_y); 
g.rotate(-angle); 
g.translate(-r.getCenterX(), -r.getCenterY()); 
g.drawString(text, 0, 0); 

o alternativamente

Rectangle2D r = g.getFontMetrics().getStringBounds(text, g); 
AffineTransform trans = AffineTransform.getTranslateInstance(final_x, final_y); 
trans.concatenate(AffineTransform.getRotateInstance(-angle)); 
trans.concatenate(AffineTransform.getTranslateInstance(-r.getCenterX(), -r.getCenterY())); 
g.setTransform(trans); 
g.drawString(text, 0, 0); 
3

Además de las otras respuestas, una vista de nivel superior:

  • puntos en la pantalla tienen Ax y Ay de coordenadas, es decir, se puede escribir como un vector (x, y) Se puede pensar que los objetos geométricos más complejos se describen mediante una colección de puntos.

  • Los vectores (punto) se pueden multiplicar por una matriz y el resultado es otro vector (punto).

  • Hay especial (es decir inteligentemente construido) matrices que cuando se multiplica con un vector que tiene el efecto de que el vector resultante es equivalente a una rotación, escala, el sesgo o con un poco de traducción engaño del punto de entrada.

Eso es todo lo que hay, básicamente. Hay algunas características más elegantes de este enfoque:

  • Si se multiplica 2 matrices se obtiene una matriz de nuevo (por lo menos en este caso, deje de puntillosa ;-)).
  • Si multiplicas 2 matrices que son equivalentes a 2 transformaciones geométricas, la matriz resultante es equivalente a hacer las 2 transformaciones geométricas una después de la otra (el orden importa por cierto).
  • Esto significa que puede codificar una cadena arbitraria de estas transformaciones geométricas en una sola matriz. Y puedes crear esta matriz multiplicando las matrices individuales.
  • Por cierto, esto también funciona en 3D.

Para más detalles, ver las otras respuestas.

Cuestiones relacionadas