Autor Tema: ¿Cual es el proceso (¿matemático?) detrás de rotar una imagen?

0 Usuarios y 1 Visitante están viendo este tema.

15 Febrero, 2025, 09:27 pm
Leído 1029 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Se me ocurrió intentar que un programa genere imágenes específicas, por ejemplo rectángulos, al azar en colores (perímetro y contenido), tamaño y rotación. Genera el rectángulo y luego puede que lo rote, eso pensé, aunque sería mejor generarlo rotado. En cualquier caso creo que debo entender qué es realmente rotar.

Se debe hallar el centro de la imagen y, entre más lejano esté un punto, más moverlo, pero el movimiento no es hacia un lado específico sino que se va curvando...

No ¿es necesario que sea desde el centro? En el caso de las agujas de un reloj, ellas no rotan desde su propio centro sino desde una de sus puntas, que está en el centro del reloj. Un rectángulo también podría rotar desde una de sus esquinas, creo, o desde otro lado. Pasa que un circulo rotando desde un punto distinto a su centro, no me lo imagino bien.
FFFFF
FFPFF
FFPFF
FFPFF
FFFFF
Fondo y pintado, cada letra es un pixel. Se quiere rotar la parte pintada, que es un rectángulo muy fino, o una recta. Si el punto que se usará de base está en su centro, no hay mucha opción, pero hay que determinar a partir de qué cantidad de grados la figura se vuelve una diagonal. / o \
Si en cambio el punto está en un extremo, podría ser que la recta se vea deformada, según cuánto se rote.
FFFFF
FFFPF
FFPFF
FFPFF
FFFFF

FFFFF
FFFPF
FFFPF
FFPFF
FFFFF

Luego sería una /

En fin ¿cómo se calcularía la nueva posición de cada pixel pintado? O mejor dicho, en qué posiciones habría que pintar pixeles.

16 Febrero, 2025, 12:20 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola, he visto que tu imagen es cuadrada , supongamos que tiene $$n\times n$$ pixeles

sea $$x$$ e $$y$$ la posición de un pixel de la imagen y sea $$\theta$$ el ángulo que quieres rotar la imagen es sentido contrario a las agujas del reloj entonces 

ejecuta esta operación de matrices

$$\begin{pmatrix}{ \cos \theta}&{-\sin\theta}\\{\sin\theta}&{\cos\theta}\end{pmatrix}\cdot \begin{pmatrix}{ x-n/2}\\{y-n/2}\end{pmatrix}+\begin{pmatrix}{ n/2}\\{n/2}\end{pmatrix}=\begin{pmatrix}{ x'}\\{y'}\end{pmatrix}$$

donde $$(x',y')$$  es la nueva posición del Pixel


Repite en loop para cada cada pixel o par $$(x,y)$$  que desees rotar

si no sabes como traducir eso a ecuaciones , son estas

tienes que

$$x'=n/2+(x-n/2)\cos\theta-(y-n/2)\sin\theta$$

$$y'=n/2+(x-n/2)\sin\theta+(y-n/2)\cos\theta$$

recuerda que $$\theta$$  es un ángulo en radianes , si quieres  cambiar  de grados a radianes debes convertirlos haciendo  $$\theta=\pi\dfrac{\alpha_{grados}}{180}$$

rotar 0 ° deja la imagen como esta, lo mismo que 360° 


180° la invierte (ojo no es una imagen espejo eso es otra cosa, requiere otra matriz)


si quieres rotar $$\alpha$$ grados pero en el sentido de las agujas del reloj   usa $$\alpha'=360-\alpha$$

Saludos
 

Saludos  \(\mathbb {R}^3\)

16 Febrero, 2025, 09:06 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Hola, he visto que tu imagen es cuadrada
La hoja, pero el dibujo no, no ocupa la hoja entera. ¿Vas a rotar la hoja? O puedo rotar "el cuadro" que ocupa, como cuando se seleccionan de a cuadros, en Paint.

Necesito hacer más el programa antes de aplicar lo que dices, cuando lo tenga aviso.

16 Febrero, 2025, 12:12 pm
Respuesta #3

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Hola,Tachikomaia.
Primero tienes que determinar un lado “a” y un lado “b” en el rectángulo; unas veces será más largo “a” y otras “b”, pero el ordenador tiene que tener esas variables, para que el giro esté siempre referido al mismo lado. Da igual que sea cuadrado o no, es lo mismo, en realidad te vale con girar un segmento, porque los lados son paralelos y giran a la vez.

Puedes girar eligiendo un extremo, pero es más lío, es mejor que el punto que se quede fijo sea el centro. Lo importante es que gires siempre de la misma manera: giro horario o antihorario, no unas veces una cosa y otras veces otra.

El giro va referido a los ejes de la pantalla, cuando el segmento se inclina, se tiene que entender referido siempre al mismo eje; la parte de abajo de la pantalla, por ejemplo. Cuando el segmento está paralelo al eje de abajo de la pantalla, puedes considerar que ésa es su posición por defecto. Entonces, si ese segmento lo proyectas sobre el eje de abajo, tienes un segmento igual de largo, pero ubicado sobre la base de la pantalla. En la medida que rota, también puedes proyectar los dos extremos en la parte de abajo, de manera el segmento proyectado irá midiendo menos que lo anterior; hasta que llega a su posición vertical, en la que mide sólo un píxel de la pantalla.

Un píxel, en realidad, no se puede girar sobre sí mismo ni trasladar a otro punto de la pantalla, son cuadraditos fijos, lo que ocurre es que cambian de color y da la impresión de que las lineas giran se mueven, no te tienes que preocupar por eso, tienes que pensar en segmentos determinados por la distancia entre dos puntos dados por unas coordenadas.

Si lo único que quieres es que aparezcan rectángulos de distintos tamaños y con distinta orientación sobre el plano, es muy sencillo, porque al ser aleatorios no dependen de una posición inicial, no se transforman, aparecen y ya está, con lo que no necesitas ni siquiera la matriz de transformación que te ha dado Richard.

Saludos.



16 Febrero, 2025, 01:39 pm
Respuesta #4

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

La hoja, pero el dibujo no,
Ok entonces voy suponer que cada uno de tus dibujos tiene $$l$$ pixeles de longitud horizontal por $$a$$ pixeles de alto.

no ocupa la hoja entera.
Con estos datos estoy suponiendo que quieres rotar un ángulo arbitrario $$\theta$$ de cada dibujo de una matriz de ellos dispuestos en tu pantalla cuadrada de $$X$$ longitud de lado.

Si vas a rotar cada dibujo, entonces tienes que tener en cuenta que su diagonal siempre es mas larga que sus lados y para que las imágenes de cada dibujo no se te superpongan tienen que estar separadas entre si mínimamente por esa distancia diagonal $$d$$, o si lo prefieres cada dibujo debe estar inscrito en una circunferencia de diámetro $$d$$

$$d$$ se calcula así $$d=\sqrt{l^2+a^2}$$  (Pitagoras)

En tu pantalla cualquier dibujo sobre los bordes el punto central de la imagen debe ubicarse mínimamente a $$d/2$$ de los extremos.
todo eso te garantiza que siempre veas todos los píxeles de cada imagen.

¿Vas a rotar la hoja?
Podría, pero entiendo que no es lo que quieres.
O puedo rotar "el cuadro" que ocupa, como cuando se seleccionan de a cuadros, en Paint.
Así es, la idea es rotar cada pixel de cada imagen rectangular, sin deformar el rectángulo y sin que un rectángulo pase por encima de otro rectángulo que este contiguo.

Entonces si la pantalla es cuadrada y cada dibujo queda dentro de una circunferencia solo puedes poner  $$n=int \dfrac{X}{d}$$ dibujos por lado, es decir te quedan $$n^2$$ dibujos de $$l\times a$$

En otros hilos hemos hablado de como localizar una imagen por su número que está entre $$1$$ y $$n^2$$ creo que con eso no tendrás problema ya.
No se que tipo de información tienes de referencia de cada imagen supongamos que conoces la ubicación del pixel ubicado en el extremo superior izquierdo, yo la llamo $$(x0,y0)$$ que no es el extremo izquierdo en tu distribucion de pantalla $$(xq,yq)$$ ya que el rectangulo es menor que ese cuadrado donde lo inscribes , en teoría $$x0=xq+(d-l)/2$$ y  $$y0=yq+(d-a)/2$$ 
entonces el centro de la imagen estará en el pixel $$(x_r,y_r)=(x0+l/2 \ ,\ y0+a/2)$$ entonces allí estará el centro de rotación de la imagen.

Ahora escojes un ángulo de rotación, digamos por ejemplo 30° en sentido contrario a las agujas del reloj,   entonces $$\alpha =30$$  y si quiero ese ángulo en radianes usaría

$$\theta=\pi\dfrac{\alpha_{grados}}{180}=\pi\dfrac{30}{180}=\dfrac{\pi}{6}=0,5235.....$$

haces un bucle $$i$$ entre $$1$$ y $$l$$ y lo anidas con otro bucle $$j$$ entre $$1$$ y $$a$$

buscas la información de color del píxel ubicado  $$xp= x0+i-1$$ e $$yp=y0+j-1$$  y la guardas en la variable color $$C$$

luego hallas la posición de ese nuevo pixel

$$x'=x0+l/2+(xp-xr)\cos\theta-(yp-yr)\sin\theta$$

$$y'=y0+a/2+(xp-xr)\sin\theta+(yp-yr)\cos\theta$$

luego pintas el pixel en la posición $$(x',y')$$ con el color  $$C$$ que guardaste

Cierras ambos loops
Y continuas  con otro número de imagen

Todo eso lo puedes poner en una función , procedimiento o subrutina donde le pasas el numero de imagen , el largo, el ancho y el ángulo a rotar, para poderla llamar donde sea dentro del programa y no repites código
 
Añado editado

ojo , todo esto es válido para un unico giro.

Si intentas repetir otro giro con la misma imagen anterior, solo giraran los píxeles dentro del rectángulo, y como parte de lo que ya habías rotado no está dentro de ese rectángulo, no rotara, por lo que la imagen se truncará,

si quieres que eso no te pase, tienes que rotar todos los puntos entre $$(xq,yq)$$ e $$(xq+l,yq+a)$$ pero solo pintar aquellos que cumplan

$$\dfrac{d}{2}\geq abs(\sqrt{(x'-xr)^2+(y'-yr)^2})$$ es decir todos aquellos que se inscriben en la circunferencia ( para optimizar tambien puedes ver si el punto está dentro de la circunferencia y luego proceder a rotarlo, esto lleva menos tiempo de máquina)


Saludos
Saludos  \(\mathbb {R}^3\)