Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: Tachikomaia en 14 Febrero 2024, 06:36 am



Título: Otro error por decimales creo.
Publicado por: Tachikomaia en 14 Febrero 2024, 06:36 am
Necesito que unos cuadrados (les llamo Pixeles) se coloquen uno al lado de otro como si fuese un tablero de ajedrez pero de 2x2, luego de 3x3, y así. El tamaño de cada píxel varía según cuantos deben caber en la pantalla. Una vez obtenido el largo, al pixel1 se lo coloca en 64, 0, al 2 en 64+largo, 0, y así hasta cierto punto, es decir, se van colocando cada vez más en la derecha, hasta antes de que se salgan de la pantalla, momento en que vuelve a comenzar desde 64 en X, pero aumenta en Y.

El problema es que ese límite, creo que al hacer sumas con decimales es superado antes de lo que debe. El programa está hecho de modo que coloca el píxel en el límite, y luego cuando lo supera hace lo que dije arriba. Cuando son 5x5 el límite es 371.2. Ocurre esto:
El pixel 1 se colocó en 64, 0
El pixel 2 se colocó en 140.8, 0
El pixel 3 se colocó en 217.6, 0
El pixel 4 se colocó en 294.4, 0
El pixel 5 se colocó en 64, 76.8 <- Mal colocado.

¿Qué puedo hacer para evitar el error? No es sólo para 5x5, debe servir para cualquier número entero digamos.

La parte que interesa está en el fotograma 2:

Código
  1.   actions for fotograma 1
  2.      PixelesdeLargo = 1;
  3.      function Variar () {
  4.         PixelaModificar = "ColordePixel"+Puntero;
  5.         ColordePixelaModificar = eval(PixelaModificar);
  6.         // ¿El pixel puede cambiar de color?
  7.         if (ColordePixelaModificar<1) {
  8.            // Sí, cambiarlo:
  9.            set (PixelaModificar, ColordePixelaModificar+1);
  10.            Col = new Color("Pixel"+Puntero);
  11.            Col.setRGB(parseInt(0, 16));
  12.            SumadePintados = SumadePintados+1;
  13.            // ¿El píxel está en el extremo derecho o abajo, donde no había en una hoja más chica?
  14.            if (Puntero/PixelesdeLargo == Math.floor(Puntero/PixelesdeLargo) or Puntero>MinPixelInferior) {
  15.               // Sí, actualizar SumadePintadosNuevos:
  16.               SumadePintadosNuevos = SumadePintadosNuevos+1;
  17.            }
  18.            // ¿El dibujo tiene píxeles donde no había en una hoja más chica...
  19.            // y son al menos (PixelesdeLargo) píxeles?
  20.            if (SumadePintadosNuevos>0 && SumadePintados>MinSumadePintados) {
  21.               DibujoListo = "Sí";
  22.               // Darme tiempo de ver el dibujo.
  23.               // Volver.
  24.               Puntero = MaxPosiciondePuntero;
  25.               gotoAndPlay (5);
  26.            } else {
  27.               // No, el dibujo es repetido, no mostrarlo y hacer otro:
  28.               DibujoListo = "No";
  29.               Puntero = MaxPosiciondePuntero;
  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.               DibujoListo = "No";
  48.            } else {
  49.               // No, aumentar tamaño de hoja y reiniciar.
  50.               DibujoListo = "Sí";
  51.               gotoAndPlay (2);
  52.            }
  53.         }
  54.      }
  55.   actions for fotograma 2
  56.      PixelesdeLargo = PixelesdeLargo+1;
  57.      Pixeles = 0;
  58.      DistanciaEntrePixeles = 384/PixelesdeLargo;
  59.      PosicionX = 64-DistanciaEntrePixeles;
  60.      MaxPosicionXdePixel = 64+DistanciaEntrePixeles*(PixelesDeLargo-1);
  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.         PosicionX = PosicionX+DistanciaEntrePixeles;
  74.         if (PosicionX>MaxPosicionXdePixel) {
  75.            PosicionX = 64;
  76.            PosicionY = PosicionY+DistanciaEntrePixeles;
  77.         }
  78.         trace ("El pixel "+Pixeles+" se colocó en "+PosicionX+", "+PosicionY);
  79.         attachMovie("mPixel", "Pixel"+Pixeles, Pixeles);
  80.         setProperty ("Pixel"+Pixeles, _x, PosicionX);
  81.         setProperty ("Pixel"+Pixeles, _y, PosicionY);
  82.         setProperty ("Pixel"+Pixeles, _width, DistanciaEntrePixeles);
  83.         setProperty ("Pixel"+Pixeles, _height, DistanciaEntrePixeles);
  84.      } while (Pixeles<MaxPosiciondePuntero);
  85.      stop ();
  86.   actions for fotograma 3
  87.      Variar();
  88.   actions for fotograma 4
  89.      Variar();
  90.      if (DibujoListo == "No") {
  91.         gotoAndPlay (3);
  92.      }
  93.   actions for fotograma 6
  94.      gotoAndPlay (3);


Título: Re: Otro error por decimales creo.
Publicado por: Tachikomaia en 16 Febrero 2024, 10:48 am
Hallé una solución a esto pero buscaba algo que resolviera el tema de los decimales, lo que hice fue evitar usarlos en el chequeo.

En vez de chequear si la posición que se asignará es menor o igual a cierta cantidad... chequeo cuántos píxeles se colocaron en una fila.

Si se deben colocar 5, cuando se colocaron 5 ya sé que debo colocarlos más abajo.

Código
  1. PixelesdeLargo = PixelesdeLargo+1;
  2. // Colocados:
  3. Pixeles = 0;
  4. DistanciaEntrePixeles = 384/PixelesdeLargo;
  5. PosicionX = 64-DistanciaEntrePixeles;
  6. EnlaFilaActual = 0;
  7. PosicionY = 0;
  8. MaxPosiciondePuntero = PixelesdeLargo*PixelesdeLargo;
  9. Puntero = MaxPosiciondePuntero;
  10. // Píxeles pintados:
  11. SumadePintados = 0;
  12. MinSumadePintados = PixelesdeLargo-1;
  13. MinPixelInferior = PixelesdeLargo*(PixelesdeLargo-1);
  14. // Píxeles pintados que no estaban en hojas de menos píxeles:
  15. SumadePintadosNuevos = 0;
  16. // Agregar píxeles en blanco:
  17. do {
  18. Pixeles = Pixeles+1;
  19. if (EnlaFilaActual < PixelesdeLargo) {
  20. EnlaFilaActual = EnlaFilaActual+1;
  21. PosicionX = PosicionX+DistanciaEntrePixeles;
  22. } else {
  23. PosicionX = 64;
  24. EnlaFilaActual = 1;
  25. PosicionY = PosicionY+DistanciaEntrePixeles;
  26. }
  27. trace("El pixel "+Pixeles+" se colocó en "+PosicionX+", "+PosicionY);
  28. attachMovie("mPixel", "Pixel"+Pixeles, Pixeles);
  29. setProperty ("Pixel"+Pixeles, _x, PosicionX);
  30. setProperty ("Pixel"+Pixeles, _y, PosicionY);
  31. setProperty ("Pixel"+Pixeles, _width, DistanciaEntrePixeles);
  32. setProperty ("Pixel"+Pixeles, _height, DistanciaEntrePixeles);
  33. } while (Pixeles<MaxPosiciondePuntero);