elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Contar cuántos cuadraditos pintados aislados hay en un dibujo.
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Contar cuántos cuadraditos pintados aislados hay en un dibujo.  (Leído 2,424 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.273


Hackentifiko!


Ver Perfil
Contar cuántos cuadraditos pintados aislados hay en un dibujo.
« en: 2 Junio 2024, 20:05 pm »

Por ejemplo aquí se considera que no hay:

En este contexto lo blanco no se considera pintado, es fondo. Todos los cuadraditos pintados tienen al menos 1 pintado al lado (diagonal también cuenta).

Estoy haciendo un generador de dibujos así y quiero que no muestre (o que no genere, sería lo ideal) los que tengan cierta cantidad de cuadraditos pintados aislados. La cantidad depende del tamaño del dibujo, no importa aquí cual es. El dibujo se va modificando de a 1 cuadradito, se pinta uno, o se despinta uno (o más) y se pinta otro. Así, debo hacer algo como:
- Cuando se pinte uno nuevo, mirar si al lado hay otro. Si no hay, incrementar el contador de aislados. Si hay, ver si ese o esos estaban aislados, en cuyo caso disminuir el contador cuanto corresponda (según cuantos eran los aislados).
- Cuando se despinte uno, mirar si hay cuadraditos pintados al lado. Si no hay, disminuir el contador de aislados. Si hay, mirar al lado de cada uno y aumentar el contador de aislados por cada uno que haya quedado aislado.

Mi pregunta es: ¿Hay un modo más fácil? ¿es posible que lo haga GPT o algo así? Es que es mucho código... Por ahora hice esto y luego vi que no sirven else ifs, sólo ifs:
Código
  1. // Para juzgar:
  2. // ¿El dibujo tiene menos de Largo/2 cuadraditos aislados?
  3. // Se actualizará el contador de pintados aislados:
  4. // De cada pintado al lado del recién pintado,
  5. // se verá si estaba aislado,
  6. // en cuyo caso disminuirá el contador.
  7. // Si no hay pintados al lado del nuevo, aumentará.
  8. CuadraditoAislado = "Sí";
  9. // ¿El modificado es el inferior derecho?
  10. if (Puntero == MaxPosiciondePuntero) {
  11. // Sí, ver el -1 (izquierdo), -L (up) y -L-1 (iu):
  12. // xSS
  13. // xS*
  14. if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
  15. CuadraditoAislado = "No";
  16. }
  17.  
  18.  
  19. if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  20. CuadraditoAislado = "No";
  21. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
  22. CuadraditoAislado = "No";
  23. }
  24. } else if (Puntero > MinCuadraditoInferior) {
  25. // Inferior no en una esquina,
  26. // contar el +1 (derecho), -1, -L+1 (du), -L y -L-1:
  27. // SSS
  28. // S*S
  29. if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  30. CuadraditoAislado = "No";
  31. } else if (eval("ColordeCuadradito"+(Puntero-1) == 1) {
  32. CuadraditoAislado = "No";
  33. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
  34. CuadraditoAislado = "No";
  35. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  36. CuadraditoAislado = "No";
  37. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
  38. CuadraditoAislado = "No";
  39. }
  40. } else if (Puntero == MinCuadraditoInferior) {
  41. // Inferior izquierdo,
  42. // contar el +1, -L+1 y -L:
  43. // SSx
  44. // *Sx
  45. if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  46. CuadraditoAislado = "No";
  47. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
  48. CuadraditoAislado = "No";
  49. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  50. CuadraditoAislado = "No";
  51. }
  52. } else if (Puntero > CuadraditosPorFila) {
  53. // No es superior.
  54. if (Puntero%CuadraditosPorFila == 0) {
  55. // Central derecho,
  56. // contar el +L, +L-1, -1, -L y -L-1:
  57. // xSS
  58. // xS*
  59. // xSS
  60. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  61. CuadraditoAislado = "No";
  62. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
  63. CuadraditoAislado = "No";
  64. } else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
  65. CuadraditoAislado = "No";
  66. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  67. CuadraditoAislado = "No";
  68. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
  69. CuadraditoAislado = "No";
  70. }
  71. } else if (Puntero%CuadraditosPorFila != 1) {
  72. // Central, contar todos los contiguos:
  73. // SSS
  74. // S*S
  75. // SSS
  76. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
  77. CuadraditoAislado = "No";
  78. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  79. CuadraditoAislado = "No";
  80. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
  81. CuadraditoAislado = "No";
  82. } else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  83. CuadraditoAislado = "No";
  84. } else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
  85. CuadraditoAislado = "No";
  86. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
  87. CuadraditoAislado = "No";
  88. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  89. CuadraditoAislado = "No";
  90. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila-1)) == 1) {
  91. CuadraditoAislado = "No";
  92. }
  93. } else {
  94. // Central izquierdo,
  95. // contar el +L+1, +L, +1, -L+1 y -L:
  96. // SSx
  97. // *Sx
  98. // SSx
  99. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
  100. CuadraditoAislado = "No";
  101. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  102. CuadraditoAislado = "No";
  103. } else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  104. CuadraditoAislado = "No";
  105. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila+1)) == 1) {
  106. CuadraditoAislado = "No";
  107. } else if (eval("ColordeCuadradito"+(Puntero-CuadraditosPorFila)) == 1) {
  108. CuadraditoAislado = "No";
  109. }
  110. }
  111. } else if (Puntero == CuadraditosPorFila) {
  112. // Superior derecho,
  113. // contar el +L+1, +L y +1:
  114. // *Sx
  115. // SSx
  116. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
  117. CuadraditoAislado = "No";
  118. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  119. CuadraditoAislado = "No";
  120. } else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  121. CuadraditoAislado = "No";
  122. }
  123. } else if (Puntero > 1) {
  124. // Superior cemtral,
  125. // contar el +L+1, +L, +L-1, +1 y -1:
  126. // S*S
  127. // SSS
  128. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
  129. CuadraditoAislado = "No";
  130. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  131. CuadraditoAislado = "No";
  132. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila-1)) == 1) {
  133. CuadraditoAislado = "No";
  134. } else if (eval("ColordeCuadradito"+(Puntero+1)) == 1) {
  135. CuadraditoAislado = "No";
  136. } else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
  137. CuadraditoAislado = "No";
  138. }
  139. } else {
  140. // Superior izquierdo,
  141. // contar el +L+1, +L y +1:
  142. // *Sx
  143. // SSx
  144. if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila+1)) == 1) {
  145. CuadraditoAislado = "No";
  146. } else if (eval("ColordeCuadradito"+(Puntero+CuadraditosPorFila)) == 1) {
  147. CuadraditoAislado = "No";
  148. } else if (eval("ColordeCuadradito"+(Puntero-1)) == 1) {
  149. CuadraditoAislado = "No";
  150. }
  151. }
  152. if (CuadraditoAislado == "Sí") {
  153. CuadraditosAislados++;
  154. }
Es decir, ahí sólo estoy viendo si el cuadradito nuevo está aislado ¡me falta ver si sus contiguos lo estaban! (o si lo están sin contar al nuevo) y me falta el caso en que se despinta un cuadradito. ¿Tal vez se podrían usar functions para evitar repetir código? No sé bien cómo. Además, siendo tanto, puede que haya cometido algún error :/


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.387


Ver Perfil
Re: Contar cuántos cuadraditos pintados aislados hay en un dibujo.
« Respuesta #1 en: 4 Junio 2024, 18:36 pm »

Hummm... otro de esos mensajes que da hasta pereza leerlo completo.

Veamos, un 'cuadradito' es de cualquier tamaño?. Al menos se puede rechazar el cuadrado de 1x1 píxel?.
Si un 'cuadradito', ya se contó, puede todavía formar parte de otro más grande?.
Si el color blanco refiere al fondo, entonces solo se forman cuadraditos de color negro, o hay más colores?....

Como ves faltan muchos detalles (y no quiero ser exhaustivo), para poder decirte algo concreto y directo.

No obstante si puedo decirte algo más simple y práctico, al menos para que puedas empezar a enforcarlo, indistintamente de las respuestas y lo que tengas en mente.

Considera una imagen (si en tu caso es en B/N, mejor), como una tabla de 'Ceros' y 'Unos'... al ser una tabla, quier decir que con filas por columnas...


Código:
funcion BuscarCandidatos(mapa, filas, columnas)
    For cada fila desde 0 hasta filas-2  
        Por cada columna desde 0 columnas-1
            Si mapa(fila, columna) = 0
                Si (Contiguos >1)  // Se asume que un cuadrado = al menos 2x2
                    si Llamada a función VerificarCuadrado(fila+1, columna-contiguos, contiguos)= true
                        Añadir cuadrado a la colecciónCuadrados.Add(fila, columna, contiguos)
                        o solo contarlos Cuadrados(contiguos) +=1  //contiguos denota el tamaño del lado.
                    fin si
                fin si

                contiguos =0
            en otro caso
                contiguos +=1
            fin si
        Siguiente
    siguiente


fin funcion

Un cuadrado será 'bueno', solo si está completamente delimitado por 'blancos a su alrededor (excepturando las 4 esquinas)...
NOTA: La primera fila se verifica en la función de arriba, aqquí el resto de filas de 11111.... y los perímetros de 0000...
Código:
buleano = Funcion Verificarcuadrado(filaY, columnaX, contiguos, filas, Columnas)
    // 1 revisamos que la columna encima sean todo 0.
    Si (filaY-2 > 0)    // si existe en el mapa
        por cada columna desde columnaX hasta ColumnaX + contiguos)
            Si mapa(filaY-2, columna) = 1 devolver false    // hay algo más adosado arriba del candidato...
        siguiente
    fin si

    // 2 Revisamos que pueda existir un cuadrado de 'contiguos*contiguos'
    por cada fila desde filaY hasta filaY+contiguos-1)
        Si (columna >0)    // 2a puede estar pegado a la pared izquierda el cuadrado
            Si mapa(fila, columna-1) = 1 devolver false // hay algo más adosado a la izquierda del candidato...
        fin si

        // 2b comprobar el cuadrado en la zona vertical...
        por cada columna desde columnaX hasta ColumnaX + contiguos-1)
            Si mapa(fila, columna) = 0 devolver false // no es un cuadrado
        siguiente

        Si (columna no es la última (columnas))  //2c puede estar pegado a la pared derecha el cuadrado
           Si mapa(fila, columnax+contiguos ) = 1 devolver false // hay algo más adosado a la derecha del candidato...
        fin si
    siguiente

    // 3 Revisamos que la columna debajo sean todo 0.
    Si (filaX+contiguos < filas)   //si la fila existe en el mapa
        por cada columna desde columnaX hasta ColumnaX + contiguos)
            Si mapa(filax+contiguos, columna) = 1 devolver false
        siguiente
    fin si

     // Si pasaron todas las pruebas, el candidato es un cuadrado.
    devolver true
fin funcion

Nota que trabajamos considerando una tabla, un mapa, un array bidimensional de valores 0-1, puede sustraerte de que son colores, así lo ves más sencillo, dibuja en un papel puntitos representando cada píxel negro, y como un valor 1, para comprender la sencillez del algoritmo...

Un cuadrado será bueno, solo si está completamente delimitado por 'blancos a su completo alrededor... pero esto puede no ser tan restrictivo según tus necesidades, no obstante esto es lo que considera el algoritmo, por eso cuando se verifica un candidato, no solo se verifica que el cuadrado esté con todos '1', también que permitrealmente sean 0... (excepto diagonalmente sobre las 4 esquinas).

NOTA: El algoritmo no está optimizado (ni considera cuadrados dentro de cuadrados), tras encontrar una 'cuadrado en una linea', las siguientes líneas de las que forma parte ese cuadrado se ven expuestas a ser buscadas de nuevo.   ...pero así el algoritmo es mucho más sencillo de entender, aunque tarde más en calcular.

Por último, te aclaro que esto es una aproximación genérica según los detalles que necesites (que no me he enterado bien, he tirado por lo lógico que uno puede aceptar como un 'cuadrado'), tendrás que modificarlo a tus necesidades.... y es fácil que a veces al escribir al vuelo se escape o falte un +1, -1... por algún lado.


« Última modificación: 4 Junio 2024, 18:39 pm por Serapis » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.273


Hackentifiko!


Ver Perfil
Re: Contar cuántos cuadraditos pintados aislados hay en un dibujo.
« Respuesta #2 en: 10 Junio 2024, 10:36 am »

Hummm... otro de esos mensajes que da hasta pereza leerlo completo.
¿Te refieres al mío o al que escribiste? Si es el mío ¿por qué te da pereza?

Citar
Veamos, un 'cuadradito' es de cualquier tamaño?
Un espacio de XxX píxeles se divide en YxY cuadraditos. X no recuerdo cuánto es e Y va aumentando a medida que se muestran los dibujos posibles de 2 colores. Así, el tamaño de los cuadraditos va disminuyendo porque deben entrar cada vez más en el espacio pero el espacio disponible es fijo.
Aquí tienes una pequeña muestra, algo antigua:
https://www.youtube.com/watch?v=0x5fEw8LGP4

Citar
Al menos se puede rechazar el cuadrado de 1x1 píxel?
No entiendo la pregunta, pero si te refieres a que si habrá de esos, supongo pero cuando la cantidad de cuadraditos por fila sea igual al tamaño de la hoja, cosa que no he llegado a probar. Estoy intentando evitar ciertos dibujos indeseados antes de dejar que el programa llegue a tantos cuadraditos por fila.

Citar
Si un 'cuadradito', ya se contó, puede todavía formar parte de otro más grande?
No se cuentan así, se cuentan individualmente, un cuadradito es el mínimo tamaño en un dibujo, es una simulación de un pixel, simplemente se ve más grande.

Citar
Si el color blanco refiere al fondo, entonces solo se forman cuadraditos de color negro, o hay más colores?....
Por ahora sólo negros, pero entiende que lo blanco también son cuadraditos de color blanco que pueden cambiar a negro y viceversa, digo que son fondo porque... cuando sean más colores (aún no), es así, como el fondo de la hoja, no es el dibujo...

Citar
Como ves faltan muchos detalles (y no quiero ser exhaustivo), para poder decirte algo concreto y directo.
Podía dar el código completo pero no creí que alguien quisiera leer tanto, además ya puse similares en temas anteriores. Lo subo a un txt para que no ocupe tanto espacio en el post:
https://drive.google.com/file/d/13dSzreVp-WgV0RMKvaRTncqB84lMj3mJ/view?usp=sharing
Y aquí tienes el editable:
https://drive.google.com/file/d/11ksgI1ZEgOSTf0o7X_TRVFLAXPmStT9F/view?usp=sharing
No funciona y aunque dice "ifs terminados", en realidad es sólo un grupo. Se me ocurrió una forma de simplificar la tarea, básicamente es tener guardado cuales coordenadas (filas y columnas) están pintadas, lo estaba evitando porque quería evitar crear variables innecesarias; si funciona como pienso cuando lo tenga hecho lo posteo.

Ok, si no me funciona lo que se me ocurrió intento aplicar lo tuyo, no lo entiendo bien.

Edit: Tras los cambios requeridos en el fotograma 2 que no vienen mucho al caso, tengo esto:
Código
  1. function Variar () {
  2. ReferenciaAlColoraModificar = "ColordeCuadradito"+Puntero;
  3. ColoraModificar = eval(ReferenciaAlColoraModificar);
  4. // ¿El cuadradito puede cambiar de color?
  5. if (ColoraModificar<1) {
  6. // Sí, hacer los cambios:
  7. set (ReferenciaAlColoraModificar, ColoraModificar+1);
  8. NuevoColor = new Color("Cuadradito"+Puntero);
  9. NuevoColor.setRGB(0);
  10. // Obtener fila y columna del cuadradito:
  11. Fila = Math.ceil(Puntero/CuadraditosPorFila);
  12. Columna = (Puntero-1)%CuadraditosPorFila+1;
  13. set("Cuadradito"+Fila+"_"+Columna, 0);
  14. // Para juzgar:
  15. // ¿El dibujo tiene menos de Largo/2 cuadraditos aislados?
  16. // Se actualizará el contador de pintados aislados:
  17. // De cada pintado al lado del recién pintado,
  18. // se verá si estaba aislado,
  19. // en cuyo caso disminuirá el contador.
  20. // Si no hay pintados al lado del nuevo, aumentará.
  21. // Esta variable puede cambiar:
  22. CuadraditoAislado = "Sí";
  23. Fila2 = Fila+1;
  24. Columna2 = Columna+1;
  25. // Si su inferior derecho existe y está pintado,
  26. // entonces el actual no está aislado,
  27. // y se mira si el infder estaba aislado:
  28. // Cuántos de sus contiguos están pintados.
  29. // Por practicidad se cuenta también el recién pintado.
  30. // Si la cantidad es 1, estaba aislado,
  31. // el contador de Aislados baja.
  32. // CONVERTIR EN FUNCIÓN:
  33. // ¿El contiguo indicado está pintado?
  34. if (eval("Cuadradito"+Fila2+"_"+Columna2) == 0 ) {
  35. // Sí, el recién pintado no está aislado:
  36. CuadraditoAislado = "No";
  37. // Se contarán los contiguos de este (contiguo al recién...).
  38. ContiguosPintados = 0;
  39. Fila3 = Fila2+1;
  40. Columna3 = Columna2+1;
  41. // CONVERTIR EN FUNCIÓN2:
  42. // ¿El contiguo indicado está pintado?
  43. if (eval("Cuadradito"+Fila3+"_"+Columna3) == 0 ) {
  44. // Sí, aumentar contador:
  45. ContiguosPintados++;
  46. }
  47. //
  48. Columna3--;
  49. // APLICAR FUNCIÓN2
  50. // Continuar modificando Col3 y fila3 y rellamando a la func2.
  51. }
  52. //
  53. Columna2--;
  54. // APLICAR FUNCIÓN
  55. // Continuar modificando Col2 y fila2 y rellamando a la func.
  56.  
  57. // en vez de usar CuadraditoAislado = "Sí"; se podría definir
  58. // ContiguosPintados = 0; desde el inicio y si aumentó entonces
  59. // se entiende que ek recién pintado no estaba aislado.
  60. // Pero igual ese contador debe reiniciarse cada vez que se empieza a contar,
  61. // pero en esos casos siempre es 1 mínimo.
No sé si funciona bien pero ahí está la idea. Falta agregar lo que dije ahí. En unos días o algo así supongo que estará.
« Última modificación: 10 Junio 2024, 12:41 pm por Tachikomaia » En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.273


Hackentifiko!


Ver Perfil
Re: Contar cuántos cuadraditos pintados aislados hay en un dibujo.
« Respuesta #3 en: 15 Junio 2024, 07:56 am »

Aquí está pero aún no tiene sentido probarlo, o no es fácil, pues me falta aplicar algo parecido al caso en que se despintan. Además tengo un error en cuanto a cómo defino los colores.
Código
  1. // En este programa hay cuadraditos nombrados así:
  2. // 123
  3. // 456
  4. // 789
  5. // Se irán pintando diferentes combinaciones,
  6. // evitando resultados en que muchos queden aislados,
  7. // dibujos producibles en hojas más pequeñas,
  8. // y simétricos (espejo vertical) ya producidos.
  9. // El tamaño de la hoja irá aumentando.
  10. // Debido a que en cierto chequeo se asume que...
  11. // si el cuadradito no está en la parte inferior ni...
  12. // superior entonces está en la fila central,
  13. // conviene que CuadraditosPorFila comience siendo 2,
  14. // cambia enseguida a 3.
  15. // PorFila y porColumna:
  16. CuadraditosPorFila = 2;
  17. // Los cuadraditos están nombrados de modo que...
  18. // los de nombre mayor están abajo en la derecha, ejemplo:
  19. // 12
  20. // 34
  21. // Usada en ContarContiguosDeContiguoAlModificado:
  22. function ParteDeContarEtc () {
  23. // ¿El contiguo indicado está pintado?
  24. if (eval("Cuadradito"+Fila3+"_"+Columna3) == 0 ) {
  25. // Sí, aumentar contador:
  26. ContiguosPintados++;
  27. }
  28. }
  29. // Usada en Variar:
  30. function ContarContiguosDeContiguoAlModificado () {
  31. // ¿El contiguo indicado está pintado?
  32. if (eval("Cuadradito"+Fila2+"_"+Columna2) == 0 ) {
  33. // Sí, el recién pintado no está aislado:
  34. ElRecienPintadoEstaAislado = "No";
  35. // Se contarán los contiguos de este (contiguo al recién...).
  36. ContiguosPintados = 0;
  37. // Para analizar a su inferior derecho:
  38. Fila3 = Fila2+1;
  39. Columna3 = Columna2+1;
  40. ParteDeContarEtc();
  41. // Para analizar a su inferior:
  42. Columna3--;
  43. ParteDeContarEtc();
  44. // Para analizar a su inferior izquierdo:
  45. Columna3--;
  46. ParteDeContarEtc();
  47. // Para analizar a su derecho:
  48. Columna3 = Columna3+2;
  49. Fila3--;
  50. ParteDeContarEtc();
  51. // Para analizar a su izquierdo:
  52. Columna3 = Columna3-2;
  53. ParteDeContarEtc();
  54. // Para analizar a su superior derecho:
  55. Columna3 = Columna3+2;
  56. Fila3--;
  57. ParteDeContarEtc();
  58. // Para analizar a su superior:
  59. Columna3--;
  60. ParteDeContarEtc();
  61. // Para analizar a su superior izquierdo:
  62. Columna3--;
  63. ParteDeContarEtc();
  64. // ¿Estaba aislado?
  65. if (ContiguosPintados == 1) {
  66. // Sí, reducir el contador:
  67. CuadraditosAislados--;
  68. }
  69. }
  70. }
  71. // En F3 se repite:
  72. function Variar () {
  73. ReferenciaAlColoraModificar = "ColordeCuadradito"+Puntero;
  74. ColoraModificar = eval(ReferenciaAlColoraModificar);
  75. // ¿El cuadradito puede cambiar de color?
  76. if (ColoraModificar < 1) {
  77. // Sí, hacer los cambios:
  78. set (ReferenciaAlColoraModificar, ColoraModificar+1);
  79. NuevoColor = new Color("Cuadradito"+Puntero);
  80. NuevoColor.setRGB(0);
  81. // Obtener fila y columna del cuadradito:
  82. Fila = Math.ceil(Puntero/CuadraditosPorFila);
  83. Columna = (Puntero-1)%CuadraditosPorFila+1;
  84. set("Cuadradito"+Fila+"_"+Columna, 0);
  85. // Para juzgar:
  86. // ¿Los cuadraditos aislados en el dibujo es...
  87. // menos de MaxCuadraditosAislados?
  88. // Se actualizará el contador de pintados aislados:
  89. // De cada pintado al lado del recién pintado,
  90. // se verá si estaba aislado,
  91. // en cuyo caso disminuirá el contador.
  92. // Si no hay pintados al lado del nuevo, aumentará.
  93. // Esta variable puede cambiar, se refiere al recién pintado:
  94. ElRecienPintadoEstaAislado = "Sí";
  95. // en vez de usar CuadraditoAislado = "Sí"; se podría definir
  96. // ContiguosPintados = 0; desde el inicio y si aumentó entonces
  97. // se entiende que ek recién pintado no estaba aislado.
  98. // Pero igual ese contador debe reiniciarse cada vez que se empieza a contar,
  99. // pero en esos casos siempre es 1 mínimo.
  100. // Para analizar a su inferior derecho:
  101. Fila2 = Fila+1;
  102. Columna2 = Columna+1;
  103. // Si su inferior derecho existe y está pintado,
  104. // entonces el actual no está aislado,
  105. // y se mira si el infder estaba aislado:
  106. // Cuántos de sus contiguos están pintados.
  107. // Por practicidad se cuenta también el recién pintado.
  108. // Si la cantidad es 1, estaba aislado,
  109. // el contador de Aislados baja:
  110. ContarContiguosDeContiguoAlModificado();
  111. // Para analizar a su inferior:
  112. Columna2--;
  113. ContarContiguosDeContiguoAlModificado();
  114. // Para analizar a su inferior izquierdo:
  115. Columna2--;
  116. ContarContiguosDeContiguoAlModificado();
  117. // Para analizar a su derecho:
  118. Columna2 = Columna2+2;
  119. Fila2--;
  120. ContarContiguosDeContiguoAlModificado();
  121. // Para analizar a su izquierdo:
  122. Columna2 = Columna2-2;
  123. ContarContiguosDeContiguoAlModificado();
  124. // Para analizar a su superior derecho:
  125. Columna2 = Columna2+2;
  126. Fila2--;
  127. ContarContiguosDeContiguoAlModificado();
  128. // Para analizar a su superior:
  129. Columna2--;
  130. ContarContiguosDeContiguoAlModificado();
  131. // Para analizar a su superior izquierdo:
  132. Columna2--;
  133. ContarContiguosDeContiguoAlModificado();
  134. if (ElRecienPintadoEstaAislado == "Sí") {
  135. CuadraditosAislados++;
  136. }
El código sigue con cosas que no vienen al caso. Lo que hice no es una forma corta ni eficiente pero evita el caos de los ifs. Sólo hay 2 ifs, que se repiten luego de haber modificado variables.

En fin, no sé cuando lo terminaré pero esta duda está resuelta.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines