4 votos

¿Cómo puedo rotar una transformación de matriz con un origen centrado?

Esto es en realidad algo que yo estoy haciendo en Objective-C de programación, pero ya que está muy orientado a matemáticas he pensado que me gustaría publicar aquí.

Yo estaba leyendo sobre transformaciones lineales: http://en.wikipedia.org/wiki/Matrix_(matemáticas)

Básicamente necesito para girar una forma alrededor de su centro. Con mi aplicación actual, la rotación se realiza utilizando la parte superior izquierda como su origen. Aquí está una captura de pantalla:

rotation matrix from top left

Este es el código que estoy usando para crear cada una de las coordenadas x,y:


CGFloat angle = 0.261799; // (15 degrees)
CGFloat xr = x1 * cosf(angle) + y1 * -sinf(angle) + tx;
CGFloat yr = x1 * sinf(angle) + y1 * cosf(angle) + ty;

Me doy cuenta de que hay funciones (CGAffineTransformRotate, etc) en Objective-C que hacer esto por mí, pero ya no lo estoy usando un UIView, tengo que hacerlo manualmente. Además, sería bueno saber. :)

Así que cuando me conecte 35.0 para tx y -35.0 para ty, (números me acabo de enterar que parecía de trabajo, a través de ensayo y error) esto es lo que obtengo:

pseudo center

Eso es lo que yo quiero! Ahora sólo necesito alguna forma de averiguar estos tx y ty valores de traducción al centro de la forma de origen, basado en el ángulo dado, los valores de ancho o altura. (También estoy viendo resultados diferentes cuando se ajuste tx y ty si el original de coordenadas x,y de la forma son diferentes.)

Cualquier ayuda sería muy apreciada. Gracias!

11voto

Matt Puntos 11

Vamos a xc, yc ser las coordenadas del centro del rectángulo.

  1. Traducir sus puntos tales que el centro es el nuevo origen:

    xt = x1 - xc;
    yt = y1 - yc;
    
  2. Rotación alrededor del origen por el ángulo a:

    c = cos(a); // compute trig. functions only once
    s = sin(a);
    xr = xt * c - yt * s;
    yr = xt * s + yt * c;
    
  3. Traducir los puntos de la espalda:

    x2 = xr + xc;
    y2 = yr + yc;
    

Si usted hace esto para todas las 4 esquinas del rectángulo y, a continuación, dibujar líneas entre las transformadas de las esquinas, obtener el rectángulo girado. El ángulo de rotación $a$ se mide desde el eje x ($0$) para el eje y ($\pi/2$). En la gráfica 2D bibliotecas el eje x va hacia la derecha y el eje va hacia abajo, de tal manera que el ángulo de $+35^\circ$ corresponde a su figura.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X