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

(1/1)

Tachikomaia:
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:

// 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
// 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.

Tachikomaia:
Creo que ya las hallé:
PixelaCaptar = (Fila-1)*PixelesdeLargo+Columna;
InversoaCaptar = (Fila-1)*PixelesdeLargo+ColumnaInversa;

Serapis:
¿Qué utilidad práctica tiene saber si una imagen es simétrica horizontal o verticalmente???.
Así a bote pronto, no se me ocurre ninguna, tal vez la haya, pero jamás he visto a nadie intentar crear una función así en ninguna parte.

Tachikomaia:
El programa es basicamente para ver cuales son los posibles dibujos que pueden generarse, por curiosidad y para aprender para otros objetivos más adelante.

Genera los dibujos posibles (de 2 colores) en cierto orden pero algunos quiero que no se muestren, por ejemplo los horizontalmente simétricos, porque a mis ojos o para el objetivo que los quiero son iguales y no me sirve ver esos, repetidos, hace que el proceso sea más largo y aburrido.

No tiene mucho que ver pero me di cuenta de que son MUCHOS dibujos los que pueden generarse, incluso sólo con 2 colores, y casi nada interesante se genera así que estoy empezando otra manera que, la idea es que implique programación genética, pero por ahora no avancé mucho. No obstante quiero seguir con este proyecto también.

¿Ver si un número es capicúa para qué sirve? Eso sí se pide mucho ¿no?

Serapis:
Si es como ejercicio... aunque entiende que como problema, en sí mismo no es un problema, quiero decir, no tiene complejidad alguna.

Si quieres hacer ejercicio, un problema (también estéril pero) que al menos si requiere pensar y ejercitar la mente y la programación operando con una imagen, es recorrer los píxeles de la imagen en espiral (cuadrada), empezando por el centro de la imagen, hacia afuera.

Un número capicúa no se suele pedir (nunca lo he visto), lo que si se suele pedir es demostrar si una cadena dada (un string) es palíndromo... en sí mismo no es útil, pero como ejercico es excelente para ejercitar el uso de pilas y colas (que es el ámbito en que se suele solicitar), o también en teoría de compiladores (automátas y lenguajes de contexto finito).

A eso me refiero... a que si te planteas algo como ejercicio, que sea por ejercitar algo específico de la programación, algo que aprendas nuevo, que profundices o que mejore tu dominio del tema... porque calcular sumas, restas multiplicación... asumo que es algo que ya tienes dominado desde hace muchos años, no?.

2 colores arrojan 2^n combinaciones, siendo 'n' la cantidad de píxeles que estimes. Es decir es binario, aún no dominas el binario?. Si es que no, verlo en colores no te ayudará mucho más, en ese caso es mejor operar en el corpus matemático... Tomar un número decimal, pasarlo a binario y 'encender o apagar bits específicos (sueltos o en grupos) en tal o cual posición y con cada cambio mostrar siempre el resultado en decimal y en binario.

No quiero ser impertinente, pero es que considero que pierdes mucho tiempo en problemas irrelevantes y entiendo que si lo emplearas en 'problemas útiles', adquirirías más conocimientos verdaderamente útiles.

p.d.: Mira, hay una operación que se llama 'transpose', y que consiste en tomar las filas y disponerlas como columnas, o al revés...
Técnicamente eso es rotar la imagen 90º... también requiere calcular (sumas, restas, multiplicaciones), pero es algo útil y tangible en la vida real.
De hecho hace muchos años edité el artículo de wikipedia 'Escítala', que es un sistema arcaico de cifrado, y que usa dicha técnica de transpose, aunque en ese caso puede alterarse a discreción el número de filas y columnas, pues se opera con letras en cada 'pixel' (casilla), apuntada por las cordenadas X,Y.
https://es.wikipedia.org/wiki/Esc%C3%ADtala

Navegación

[0] Índice de Mensajes