Autor Tema: Ver si una imagen es horizontalmente simétrica o no.

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

18 Abril, 2024, 08:47 am
Leído 67 veces

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 596
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Digamos que los pixeles tienen estos nombres:
123
456
789
Cada uno tiene un color guardado en una variable.

Debo hacer algo así:
Código: [Seleccionar]
// Si esta variable no cambia, el dibujo es simétrico:
Simetrico = "Sí"
X = Concatenar 123
Y = Concatenar 321
Si X != Y
  Simetrico = "No"
sino
  X = Concatenar 456
  Y = Concatenar 654
  Si X != Y
    Simetrico = "No"
  sino
    X = Concatenar 789
    Y = Concatenar 987
    Si X != Y
      Simetrico = "No"

Pero si el dibujo es muy grande no puedo hacer eso, tantos "si" metidos unos en otros y tantos concatenar. El tamaño del dibujo es variable.

Estoy intentando un par de loops así:
Código: [Seleccionar]
// Se captarán los colores de cada fila y al revés:
// Si son distintos, ya no, el dibujo no es simétrico.
Fila = 0;
// Empezar a captar de una nueva fila:
do {
ColoresDeFila = "";
InversionDeFila = "";
Fila++;
Columna = 0;
ColumnaInversa = PixelesdeLargo+1;
// Captar siguiente columna:
do {
Columna++;
PixelaCaptar = ...
ColoresDeFila = ColoresDeFila+eval("ColordePixel"+PixelaCaptar);
ColumnaInversa--;
InversoaCaptar = ...
InversionDeFila = InversionDeFila+eval("ColordePixel"+InversoaCaptar);
while Columna<PixelesdeLargo
Si ColoresDeFila != InversionDeFila
Simetrico = "No"
Fila = PixelesdeLargo
while Fila<PixelesdeLargo
Pero me falta lo que va en los puntos suspensivos, son fórmulas matemáticas cuyos resultados indican el pixel que debe mirarse y el opuesto. Tomando como base el tamaño que puse al inicio, PixelesdeLargo es 3. Bueno...
Cuando fila es 1 y columna 1, el pixel señalado debe ser el 1.
1 y 2: 2.
1 y 3: 3.
2 y 1: 4.
¿Cual es la fórmula? Puede iniciarse a contar desde fila 0 y columna 0 si les queda más cómodo.

Son 2 fórmulas las que preciso, pero teniendo una creo que puedo averiguar la otra.

Está relacionado con esto pero creo que es al revés:
https://foro.rinconmatematico.com/index.php?topic=126225.0
Ahí es Averiguar columna y fila de un casillero,
acá es averiguar el pixel teniendo la columna y fila.

21 Abril, 2024, 11:32 am
Respuesta #1

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 596
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Creo que ya las hallé:
PixelaCaptar = (Fila-1)*PixelesdeLargo+Columna;
InversoaCaptar = (Fila-1)*PixelesdeLargo+ColumnaInversa;

21 Abril, 2024, 04:50 pm
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,357
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Supón que la imagen tendría $$U$$ pixeles de ancho por $$V$$ de alto

Entiendo tu quieres checar simetría en un eje vertical, tu tienes 4,5,6 te interesa que sea igual a lo que hay en 6,5,4 , observa que solo tiene que averiguar si lo que hay en 6 es lo mismo que hay en 4 , y lo que hay en 5 es lo que hay en 5.

Haz un loop  de $$n$$  de $$1$$ a $$V$$
Haz otro loop de $$m$$ desde $$1$$ hasta el entero de $$U/2$$. Si tienes  numerados los píxeles horizontalmente el primero es $$1$$ y el último de la fila es $$U$$  en la segunda línea cuando el primero es $$U+1$$ y el último $$2U$$ en la 3ra  $$2U+1$$ y $$3U$$

En cada fila con el segundo bucle comprueba que lo que hay  $$(n-1)\cdot U+m$$ sea igual a lo que hay en $$n\cdot U+1-m$$
cuando encuentres solo un resultado fuera de la igualdad, ya no será simétrico y corta ambos bucles para minimizar tiempo.
Si ambos bucles terminan siempre con resultado positivo , entonces será simétrica.

Si quieres simetría horizontal haz un loop m de 1 a U. Otro n de 1 a V/2. Comprueba que lo que hay en $$(n-1)\cdot U+m$$ sea igual $$(V-n)\cdot U+m$$  ante la primer falla no hay simetría sobre un eje horizontal.

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

24 Abril, 2024, 01:30 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 596
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Entiendo tu quieres checar simetría en un eje vertical
Horizontal. Esto: 123 = 321
No esto:
1
2
3
||
3
2
1

También debes tener en cuenta que la imagen a chequear empieza a tener más píxeles luego de un tiempo, o sea que puede tener 4*4, no siempre hay un centro entero. Lo que se mantiene es que es cuadrada.

Veo que yo no puse eso de que se detenga "en el medio", es buena idea, lo pensaré. Pero me costó entender tu mensaje, parece como si hubieras respondido sólo basado en el título, describiste un código cuando yo ya había puesto uno casi hecho.

24 Abril, 2024, 02:35 am
Respuesta #4

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,357
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola yo no se programar  tu lenguaje pero entiendo de algoritmos,  una vez que sabes algo de algoritmos solo debes conocer de memoria o por consulta en san Google que instrucción  se usa para que el programa  haga lo que quieres en ese lenguaje.

Simetría  horizontal o vertical como quieras que da lo mismo usa el que te sirva, no voy a ponerme a interpretar tu código, usa tu mis fórmulas como quieras cuando codifiques en el lenguaje que quieras.

En tu simetría horizontal  tu espejo está en línea vertical. ;)

Si \( n \) es impar, la línea del medio es simétrica consigo misma,  no tienes que compararla con nada, solo son necesarias el entero de \( n/2 \) comparaciones lo mismo cuando es n par.

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