Autor Tema: ¿Cómo producir variaciones rápidamente?

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

25 Febrero, 2024, 06:12 am
Leído 100 veces

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 588
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Este código produce dibujos negros y blancos:
Código: [Seleccionar]
  actions for fotograma 1
      PixelesdeLargo = 1;
      // En el frame 3 se repite:
      function Variar () {
         PixelaModificar = "ColordePixel"+Puntero;
         ColordePixelaModificar = eval(PixelaModificar);
         // ¿El pixel puede cambiar de color?
         if (ColordePixelaModificar<1) {
            // Sí, hacer los cambios:
            set (PixelaModificar, ColordePixelaModificar+1);
            Col = new Color("Pixel"+Puntero);
            Col.setRGB(parseInt(0, 16));
            // Para juzgar: ¿El dibujo es repetido?
            SumadePintados = SumadePintados+1;
            // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica?
            if (Puntero/PixelesdeLargo == Math.floor(Puntero/PixelesdeLargo) or Puntero>MinPixelInferior) {
               // Sí, actualizar SumadePintadosNuevos:
               SumadePintadosNuevos = SumadePintadosNuevos+1;
            }
            // ¿El dibujo tiene píxeles donde no había en una hoja más chica...
            // y son al menos (PixelesdeLargo) píxeles?
            if (SumadePintadosNuevos>0 && SumadePintados>MinSumadePintados) {
               // Sí, hacer dibujo y dar tiempo para verlo:
               Puntero = MaxPosiciondePuntero;
               play ();
            } else {
               // No, el dibujo es repetido, no mostrarlo y hacer otro:
               Puntero = MaxPosiciondePuntero;
               Variar();
            }
         } else {
            // El pixel no puede cambiar de color, resetearlo:
            set (PixelaModificar, 0);
            Col = new Color("Pixel"+Puntero);
            Col.setRGB(parseInt("FFFFFF", 16));
            SumadePintados = SumadePintados-1;
            // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica?
            if (Puntero/MaxPosiciondePuntero == Math.floor(Puntero/MaxPosiciondePuntero) or Puntero>MinPixelInferior) {
               // Sí, actualizar SumadePintadosNuevos:
               SumadePintadosNuevos = SumadePintadosNuevos-1;
            }
            // ¿Hay un pixel anterior?
            if (Puntero>1) {
               // Sí, apuntar a ese:
               Puntero = Puntero-1;
               // Continuar haciendo el dibujo:
               Variar();
            } else {
               // No, aumentar tamaño de hoja y reiniciar.
               gotoAndPlay (2);
            }
         }
      }
   actions for fotograma 2
      PixelesdeLargo = PixelesdeLargo+1;
      // Colocados:
      Pixeles = 0;
      DistanciaEntrePixeles = 384/PixelesdeLargo;
      PosicionX = 64-DistanciaEntrePixeles;
      EnlaFilaActual = 0;
      PosicionY = 0;
      MaxPosiciondePuntero = PixelesdeLargo*PixelesdeLargo;
      Puntero = MaxPosiciondePuntero;
      // Píxeles pintados:
      SumadePintados = 0;
      MinSumadePintados = PixelesdeLargo-1;
      MinPixelInferior = PixelesdeLargo*(PixelesdeLargo-1);
      // Píxeles pintados que no estaban en hojas de menos píxeles:
      SumadePintadosNuevos = 0;
      // Agregar píxeles en blanco:
      do {
         Pixeles = Pixeles+1;
         if (EnlaFilaActual<PixelesdeLargo) {
            EnlaFilaActual = EnlaFilaActual+1;
            PosicionX = PosicionX+DistanciaEntrePixeles;
         } else {
            PosicionX = 64;
            EnlaFilaActual = 1;
            PosicionY = PosicionY+DistanciaEntrePixeles;
         }
         trace ("El pixel "+Pixeles+" se colocó en "+PosicionX+", "+PosicionY);
         attachMovie("mPixel", "Pixel"+Pixeles, Pixeles);
         setProperty ("Pixel"+Pixeles, _x, PosicionX);
         setProperty ("Pixel"+Pixeles, _y, PosicionY);
         setProperty ("Pixel"+Pixeles, _width, DistanciaEntrePixeles);
         setProperty ("Pixel"+Pixeles, _height, DistanciaEntrePixeles);
      } while (Pixeles<MaxPosiciondePuntero);
      stop ();
   actions for fotograma 3
      stop ();
   actions for Vacío
      onClipEvent (enterFrame) {
         _level0.Variar();
      }
   actions for fotograma 4
      stop ();
   actions for fotograma 5
      gotoAndPlay (3);

La función se repite dentro de si misma, supongo que un do while sería mejor, no me di cuenta, pero ese no es el tema, el tema es que hago algo así:
Si ColordePixel4 puede colorearse, hacerlo y mostrar dibujo.
sino resetearlo. Si el 3 puede colorearse, hacerlo y mostrar dibujo.
sino resetearlo. Si el 2...
Y así hasta el 1.
Cuando hay más píxeles, eso se repite más veces.

¿Qué otro método más rápido sería mejor? ¿es posible, cómo? Me refiero a algo que varíe todo lo necesario sin tener que variar un puntero y repetir un while y estar reseteando 1 cosa a la vez...

Si un humano quiere escribir una lista así:
0001
0010
0011
0100
etc
No sé bien cómo se hace, pero es como que se mira dónde hay que sumar y si los valores a la derecha están al máximo se resetean. O sea, desde la izquierda se busca el 1er valor que no esté al máximo, se lo aumenta y se resetean los a la derecha suyo. Pero nosotros los humanos es como que no necesitamos mirar desde la izquierda, ya más o menos podemos anticipar en dónde estará el próximo número que debe aumentarse ¿o no?

No sé, a mí esa manera me resulta muy lenta, variando las cosas de a una, siento que debe haber algo mejor.

Una posibilidad sería hacer sumas normales y luego convertirlo en el valor que se precisa:
0 -> 0000
1 -> 0001
2 -> 0010
Hacer la conversión no creo que tarde mucho ¿pero si los posibles valores fuesen más de 9 o de 10? Por eso uso varias variables, no sólo 1. Uds supongo que usan arrays, pero creo que en el fondo es igual. Si son menos de 9 o 10 posibles valores la conversión es literal:
ColordePixel4 = Caracter4
ColordePixel3 = Caracter3
etc
Sino creo que se deben hacer operaciones matemáticas para cada uno y eso implica usar un do while...

Hay que inventar algo mejor o díganme qué hay que no sé xD

Para colmo, en el caso particular de los dibujos, tengo que variar unas variables y luego debo variar colores en base a ellas, creo que lo puedo hacer más rápido, pero el punto es que tendría que usar un do while también (edit: quizá no, probaré).

Tampoco es cuestión de estar haciendo los dibujos desde 0 en cada caso, yo intento que se varíen sólo los pixeles que deben variarse.

¿Ideas, info?

26 Febrero, 2024, 12:40 am
Respuesta #1

Richard R Richard

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

No veo claro que es lo que hace tu programa.

Observa que si tu estas escribiendo en binario (ceros y unos ) los números decimales , hay algoritmos de conversión en github


en general al último número le sumas 1 y si sumando en en decimal sumara 2 , conviertes el 2 es "10" entonces el resultado de esa cifra se pone en cero y suma uno al de la izquierda


$$0000 + 1=0001$$
$$0001 + 1="0002"\to 0010$$
$$0010 + 1=0011$$
$$0011 + 1="0012"\to"0020"\to 0100$$
$$0100 + 1=0101$$
$$0101 + 1=0110$$
$$0110 + 1=0111$$
$$0111 + 1=1000$$
$$1000 + 1=1001...$$
 
$$1111 + 1=10000....$$


Espero haber interpretado bien lo que hacía tu programa, sino explica un ejemplo.


si fuera en general que tienes colecciones de elementos diferentes  con distinta cantidad de elementos en cada conjunto y quieres escribir cada variación posible

Una idea sería hacer
  • numerar las colecciones i
  • calcular la cantidad de elementos de cada colección $$C_i$$. la cantidad de variaciones es la multiplicación de la cantidad de elementos de cada colección $$N=C_1\cdot C_2\cdot...\cdot C_N=\prod\limits _{i=1}^n C_i$$
  • hacer un único bucle de 0 hasta $$N-1$$
  • en un array guardar el valor actual del último elemento que calculaste de cada colección, al inicio todos estarán en cero
  • imprime el valor relativo al índice de cada colección
  • suma 1 al indice de la ultima colección
  • has otro bucle preguntando cada índice de las colecciones es igual $$C_i$$ es decir mas del máximo $$C_i-1$$ entonces pones ese índice a 0 y suma 1 al indice de la siguiente colección, el bucle continua , cuando pase de nuevo el bucle todas las colecciones que hayan pasado el máximo y las pone a cero y agreg una a la siguiente.
  • El programa para cuando ejecutó las N variaciones posibles
Saludos
Saludos  \(\mathbb {R}^3\)

27 Febrero, 2024, 05:47 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 588
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
No veo claro que es lo que hace tu programa.
Dibujos en blanco y negro usando píxeles cada vez más pequeños, de modo que entran cada vez más cantidad en la hoja, que queda como si fuese un espacio de 2x2, luego de 3x3, y así. Cuando se hicieron todos los dibujos posibles con el tamaño especificado de pixeles, disminuye y se empieza a hacer con píxeles más pequeños. Se intenta evitar dibujos que ya fueron hechos con pixeles más grandes. Ejemplo:

Los píxeles son nombrados así:
12
34
en ese caso que son 4. 1ero se pinta el 4, pero como es repetido (1 pixel solo se asume que fue hecho en un dibujo de 1x1) no se muestra. Luego pinta sólo el 3, pero ocurre lo mismo. Luego pinta el 4 y 3, ahora sí. Es como si fuese eso de:
0001
0010
0011
etc
1 es pintado.

¿Se entiende? Te puedo dar un archivo exe si quieres.

Fua no entiendo tu idea, y no sé bien cómo explicarte mejor. El proceso que uso es más o menos así:
Código: [Seleccionar]
Pixel1 = 0
Pixel2 = 0
Pixel3 = 0
Pixel4 = 0
Repetir:
Si Pixel4<1
  Pixel4++
  Mostrar dibujo
sino
  Pixel4=0
  Si Pixel3<1
    Pixel3++
    Mostrar dibujo
  sino
    Pixel3=0
    Si Pixel2<1
      Pixel2++
      Mostrar dibujo
    sino
      Pixel2=0
      Si Pixel1<1
        Pixel1++
        Mostrar dibujo
      sino
        Pixel1=0
        Aumentar cantidad de píxeles
Yo me pregunto si hay algo mejor que estar reseteando a cada rato a 0 los píxeles, y sin tener que estar chequeando tanto if (que yo no pongo muchos pero en mi caso la repetición se hace cada vez que cambia un pixel, porque es ¿qué hacer con el 4? Listo ¿qué hacer con el 3? Listo, y así hasta el 1. Imagina si fuesen muchos más).

27 Febrero, 2024, 08:59 am
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,354
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si partes de 1x1 completo en estado 1 luego no sería posible cualquier  cuadrado de nxn con todos los n^2 cuadrados en estado 1 por que repetiría el diseño pleno
1x1

0 blanco total se dibuja
1 negro total se dibuja

2x2
00
00 repetiría el blanco total

00
01 se dibuja

00
10 se dibuja

00
11 se dibuja

01
00 se dibuja

01
10 se dibuja

01
11 se dibuja

10
00 se dibuja

10
01 se dibuja

10
11 se dibuja

11
00 se dibuja

11
10 se dibuja

11
11 es todo negro no se dibuja

3x3

No se dibujan solo el todo blanco y el todo negro
000
000
000

111
111
111

Con 4x4

No se dibuja el todo blanco el todo negro pero , tampoco los que 4 pixeles reemplacen un cuadrado del 2x2 ya pintado
0000
0000
0000
0001 se pinta

Pero
0000
0000
0011
0011 no se pinta ya que es igual a

00
01

Esa sería  la lógica?

De cuantos píxeles seia el dibujo máximo de n x n?
Cuando n es un número primo solo no dibujas los plenos.
Aunque no veo como seguir la lógica del descarte si las cadenas a comparar son diferentes.
Saludos  \(\mathbb {R}^3\)

02 Marzo, 2024, 07:06 am
Respuesta #4

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 588
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Las restricciones que pongo creo que son otro tema, de hecho debo poner más.

Por ahora las condiciones son:
- Si en el ancho o largo de la hoja caben N píxeles, el dibujo debe tener al menos N píxeles pintado (negro, blanco es fondo, no pintado).
- Debe haber al menos 1 píxel pintado en la parte inferior o en la derecha. Imagina que la hoja era
AA
AA
y se hicieron todos los dibujos posibles. Ahora es:
AAB
AAB
BBB
O sea, si sólo se pintan los de A, es como lo que se hizo antes, por eso debe haber algún B pintado. Debo ver que esto esté funcionando bien.

Subo un video a YT:
Lo que se muestra en gris es porque así veo que las imágenes se pusieron en el lugar y con el tamaño adecuados, puedes asumir que es blanco y que es parte de la hoja.

No hay máximo, el proceso es muy lento y aburrido de ver así que no he llegado a mucho, debo mejorarlo.

Si quieres te digo todos los estados del programa, la cuestión es que no hace los dibujos tan rápido como quisiera, porque mi método es lento.

Citar
00
01 se dibuja
No, porque sólo hay 1 píxel pintado, como ocurrió en el 1x1, aquí debe haber al menos 2.

Citar
00
10 se dibuja
Tampoco.

01
00 No.

En fin, ya habrás entendido.

Citar
0000
0000
0011
0011 no se pinta ya que es igual a

00
01
No es igual a ese, pero la idea es que no se pinte porque
11
11
ya se hizo, sin embargo no sé qué condiciones poner para evitar ese tipo de repeticiones, creo que es otro tema.

Últimamente he estado pensando en hacerlo similar al juego de la vida ¿lo conocés? Porque de ese modo me evito el problema de dibujos con pixeles desconectados, ej:
100
000
101
Eso es nada, 3 puntos nada más, o al menos no son el tipo de dibujos que me interesan. Quiero ver dibujos hechos, no cosas como esto:

xD

02 Marzo, 2024, 09:42 pm
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 2,354
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Las restricciones que pongo creo que son otro tema, de hecho debo poner más.

Por ahora las condiciones son:
- Si en el ancho o largo de la hoja caben N píxeles, el dibujo debe tener al menos N píxeles pintado (negro, blanco es fondo, no pintado).
- Debe haber al menos 1 píxel pintado en la parte inferior o en la derecha. Imagina que la hoja era
AA
AA
y se hicieron todos los dibujos posibles. Ahora es:
AAB
AAB
BBB
O sea, si sólo se pintan los de A, es como lo que se hizo antes, por eso debe haber algún B pintado. Debo ver que esto esté funcionando bien.

Subo un video a YT:
Lo que se muestra en gris es porque así veo que las imágenes se pusieron en el lugar y con el tamaño adecuados, puedes asumir que es blanco y que es parte de la hoja.

No hay máximo, el proceso es muy lento y aburrido de ver así que no he llegado a mucho, debo mejorarlo.

Si quieres te digo todos los estados del programa, la cuestión es que no hace los dibujos tan rápido como quisiera, porque mi método es lento.

Citar
00
01 se dibuja
No, porque sólo hay 1 píxel pintado, como ocurrió en el 1x1, aquí debe haber al menos 2.

Citar
00
10 se dibuja
Tampoco.

01
00 No.

En fin, ya habrás entendido.

Citar
0000
0000
0011
0011 no se pinta ya que es igual a

00
01
No es igual a ese, pero la idea es que no se pinte porque
11
11
ya se hizo, sin embargo no sé qué condiciones poner para evitar ese tipo de repeticiones, creo que es otro tema.


Lo siento, sigo sin ver el objetivo de fondo, no sé que recomendarte.

Últimamente he estado pensando en hacerlo similar al juego de la vida ¿lo conocés?






Si , lo conozco, lo intente programar, pero me quedo muy lento para lo que pretendía y no lo pude mejorar.



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

04 Marzo, 2024, 02:10 am
Respuesta #6

Tachikomaia

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 588
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Mi objetivo es ver diferentes dibujos y quizá usar en un videojuego alguno que me guste, se llaman sprites:

Pero por ahora los míos sólo son de 1 color + fondo, porque estoy practicando.

El objetivo del tema es encontrar un modo de producirlos más rápido, en el sentido de que cada nuevo estado se produzca más rápido en vez de hacer resets y en vez de ver si una parte puede aumentar, y luego otra, etc.

Para producir distintos números hacemos:
Código: [Seleccionar]
Numero = 0
Repetir:
  Numero++

No sé internamente cuan eficiente, económicamente, hace eso la PC, pero imagino que bien. En cambio, si se quiere un conteo binario, como te comenté tengo que ver si el último valor puede aumentar, y luego el anterior, y así, parece un mal proceso. Tampoco parece que sea la solución usar una fórmula matemática para convertir el conteo normal a binario, porque ese número lo debo usar para pintar los píxeles, entonces debo modificar el píxel último según indique el último número, luego el penúltimo, y así hasta el más delantero (o izquierdero), y yo quiero algo más instantáneo. Quizá es imposible.