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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Cómo producir variaciones rápidamente?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo producir variaciones rápidamente?  (Leído 339 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.217


Superhacker (es broma xD )


Ver Perfil
¿Cómo producir variaciones rápidamente?
« en: 25 Febrero 2024, 06:07 am »

Hace poco hice un tema similar:
https://foro.elhacker.net/programacion_general/iquestcomo_los_numeros_se_producirian_mas_rapido_en_mflash_5-t520859.0.html
Pero este no es tanto sobre Flash, aquél más o menos ya lo resolví.

Este código produce dibujos negros y blancos:
Código
  1.   actions for fotograma 1
  2.      PixelesdeLargo = 1;
  3.      // En el frame 3 se repite:
  4.      function Variar () {
  5.         PixelaModificar = "ColordePixel"+Puntero;
  6.         ColordePixelaModificar = eval(PixelaModificar);
  7.         // ¿El pixel puede cambiar de color?
  8.         if (ColordePixelaModificar<1) {
  9.            // Sí, hacer los cambios:
  10.            set (PixelaModificar, ColordePixelaModificar+1);
  11.            Col = new Color("Pixel"+Puntero);
  12.            Col.setRGB(parseInt(0, 16));
  13.            // Para juzgar: ¿El dibujo es repetido?
  14.            SumadePintados = SumadePintados+1;
  15.            // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica?
  16.            if (Puntero/PixelesdeLargo == Math.floor(Puntero/PixelesdeLargo) or Puntero>MinPixelInferior) {
  17.               // Sí, actualizar SumadePintadosNuevos:
  18.               SumadePintadosNuevos = SumadePintadosNuevos+1;
  19.            }
  20.            // ¿El dibujo tiene píxeles donde no había en una hoja más chica...
  21.            // y son al menos (PixelesdeLargo) píxeles?
  22.            if (SumadePintadosNuevos>0 && SumadePintados>MinSumadePintados) {
  23.               // Sí, hacer dibujo y dar tiempo para verlo:
  24.               Puntero = MaxPosiciondePuntero;
  25.               play ();
  26.            } else {
  27.               // No, el dibujo es repetido, no mostrarlo y hacer otro:
  28.               Puntero = MaxPosiciondePuntero;
  29.               Variar();
  30.            }
  31.         } else {
  32.            // El pixel no puede cambiar de color, resetearlo:
  33.            set (PixelaModificar, 0);
  34.            Col = new Color("Pixel"+Puntero);
  35.            Col.setRGB(parseInt("FFFFFF", 16));
  36.            SumadePintados = SumadePintados-1;
  37.            // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica?
  38.            if (Puntero/MaxPosiciondePuntero == Math.floor(Puntero/MaxPosiciondePuntero) or Puntero>MinPixelInferior) {
  39.               // Sí, actualizar SumadePintadosNuevos:
  40.               SumadePintadosNuevos = SumadePintadosNuevos-1;
  41.            }
  42.            // ¿Hay un pixel anterior?
  43.            if (Puntero>1) {
  44.               // Sí, apuntar a ese:
  45.               Puntero = Puntero-1;
  46.               // Continuar haciendo el dibujo:
  47.               Variar();
  48.            } else {
  49.               // No, aumentar tamaño de hoja y reiniciar.
  50.               gotoAndPlay (2);
  51.            }
  52.         }
  53.      }
  54.   actions for fotograma 2
  55.      PixelesdeLargo = PixelesdeLargo+1;
  56.      // Colocados:
  57.      Pixeles = 0;
  58.      DistanciaEntrePixeles = 384/PixelesdeLargo;
  59.      PosicionX = 64-DistanciaEntrePixeles;
  60.      EnlaFilaActual = 0;
  61.      PosicionY = 0;
  62.      MaxPosiciondePuntero = PixelesdeLargo*PixelesdeLargo;
  63.      Puntero = MaxPosiciondePuntero;
  64.      // Píxeles pintados:
  65.      SumadePintados = 0;
  66.      MinSumadePintados = PixelesdeLargo-1;
  67.      MinPixelInferior = PixelesdeLargo*(PixelesdeLargo-1);
  68.      // Píxeles pintados que no estaban en hojas de menos píxeles:
  69.      SumadePintadosNuevos = 0;
  70.      // Agregar píxeles en blanco:
  71.      do {
  72.         Pixeles = Pixeles+1;
  73.         if (EnlaFilaActual<PixelesdeLargo) {
  74.            EnlaFilaActual = EnlaFilaActual+1;
  75.            PosicionX = PosicionX+DistanciaEntrePixeles;
  76.         } else {
  77.            PosicionX = 64;
  78.            EnlaFilaActual = 1;
  79.            PosicionY = PosicionY+DistanciaEntrePixeles;
  80.         }
  81.         trace ("El pixel "+Pixeles+" se colocó en "+PosicionX+", "+PosicionY);
  82.         attachMovie("mPixel", "Pixel"+Pixeles, Pixeles);
  83.         setProperty ("Pixel"+Pixeles, _x, PosicionX);
  84.         setProperty ("Pixel"+Pixeles, _y, PosicionY);
  85.         setProperty ("Pixel"+Pixeles, _width, DistanciaEntrePixeles);
  86.         setProperty ("Pixel"+Pixeles, _height, DistanciaEntrePixeles);
  87.      } while (Pixeles<MaxPosiciondePuntero);
  88.      stop ();
  89.   actions for fotograma 3
  90.      stop ();
  91.   actions for Vacío
  92.      onClipEvent (enterFrame) {
  93.         _level0.Variar();
  94.      }
  95.   actions for fotograma 4
  96.      stop ();
  97.   actions for fotograma 5
  98.      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?


« Última modificación: 25 Febrero 2024, 06:12 am por Tachikomaia » 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