Autor Tema: ¿Pista sobre cómo generar cuadrados?

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

28 Febrero, 2025, 05:08 am
Leído 1963 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Ya llevo bastante con el tema y no he podido.

Tengo cuadraditos numerados así:
0   1   2   3
4   5   6   7
8   9   10 11
12 13 14 15
Puedo poner muchos más, eso es sólo un ejemplo, pero siempre forman un cuadrado.

Quiero que algunos de ellos se pinten de otro color, formando un cuadrado.

Lo que tengo es esto:
Código: [Seleccionar]
function GenerarCuadrados () {
// Pintar cuadraditos de modo que se forme un cuadrado:
// Determinar su base y altura:
Lado = random(CuadraditosPorFila)+1;
// Determinar dónde empieza:
FilaInicial = random(CuadraditosPorFila-Lado);
ColumnaInicial = random(CuadraditosPorFila-Lado);
// Pintar los cuadraditos de esa imagen:
TotalaPintar = Lado*Lado;
ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
CuadraditoaRepintar = 0;
// Sus columnas y filas se cuentan desde 0:
Columna = 0;
Fila = 0;
do {
CuadraditoaRepintar++;
// Averiguar qué cuadradito es:
NroDelCuadradito = (Fila+FilaInicial)*CuadraditosPorFila+Columna+ColumnaInicial;
ColorDeCuadradito = new Color("Cuadro0.Cuadradito"+NroDelCuadradito);
ColorDeCuadradito.setRGB(ColorDeImagen);
Columna++;
if (Columna+ColumnaInicial == CuadraditosPorFila) {
Columna = 0;
Fila++;
}
} while (CuadraditoaRepintar<TotalaPintar);
}

Aquí un ejemplo de una falla:
Lado: 3
FilaInicial: 0
ColumnaInicial: 1
TotalaPintar: 9
NroDelCuadradito: 1
NroDelCuadradito: 2
NroDelCuadradito: 3
NroDelCuadradito: 4
NroDelCuadradito: 5
NroDelCuadradito: 7
NroDelCuadradito: 8
NroDelCuadradito: 9
NroDelCuadradito: 10


Entiendo que, quizá, estoy pìntando hasta la columna final y lo que debo hacer es pintar hasta columnainicial+lado ¿puede ser? Debo crear una variable ColumnaFinal y FilaFinal ¿?

01 Marzo, 2025, 02:14 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola , tu dispones de un cuadrado de $$n$$ por $$n$$ cuadraditos , cada cuadradito está numerado del 0 al $$\color {blue}n^2-1\color {black}$$

por lo que vi que has hecho , escojes una posición al azar $$x$$ entre esos valores y un tamaño al azar $$m$$ para crear un dibujo de un cuadrado de color al azar entre los que permites.
corrijo porque la numeración de los cuadraditos empieza en 0 y no en 1
primero debes checar que la posición $$x$$, en fila y columna no te permite escoger de todos los tamaños de cuadrados que quieras  ,  supon $$n=4$$, si me paro en el cuadrado 6 ,y deseo pintar cuadrados de lado aleatorio de longitud $$m$$ allí solo puedo pintar  ese cuadradito 6 si resulta que  $$m=1$$ o si  $$m=2$$  puedes pintar el 6,7,10 y 11 , formando un cuadrado de 2x2, pero para  $$m=3$$ ya te queda fuera del cuadrado de 4x4, es decir $$m$$ lo puedes escoger de un tamaño menor a  $$n$$ menos el máximo entre número de fila y número de columna que obtienes del número x)   

$$\color {blue}fila= int(x/n)+1\color {black}$$
 las filas van de 1 a n

$$\color {blue}columna=x-(fila-1)*n+1\color {black}$$
las columnas van de 1 a n

si $$n-fila>n-columna$$ entonces
    $$q=n-columna+1$$
sino
   $$q=n-fila+1$$

 luego $$m= random (entre \ 1\ y\ q)$$

una vez que tienes todos estos datos $$x, n, m,$$ y  $$c(color)$$ 

haces un for $$a$$    de 1 a m
y otro for anidado $$b$$ tambien de 1 a m

$$z=x+(b-1)* (n*(a-1)+1)$$
aplicar color  c a los cuadraditos número z

listo
no se en que lenguaje programas así que no puedo pasar codigo porque no conozco su sintaxis
si tienes dudas imprime los valores de z y veras que son los números de los cuadraditos que debes pintar.


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

02 Marzo, 2025, 05:32 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
debes checar que la posición $$x$$, en fila y columna no te permite escoger de todos los tamaños de cuadrados que quieras
Eso creo que ya lo tengo bien porque la posición inicial se elige basada en el tamaño, o sea, si por ejemplo se elige el tamaño máximo entonces la única posibilidad es que se elija la posición más hacia la izquierda. A las opciones, al azar, se le resta el tamaño, reduciendo la cantidad de opciones, eliminando las que resulten inválidas.

El lenguaje es Action Script de Macromedia Flash 5.

Intentaré avanzar, tendré en cuenta lo que has dicho. Luego pongo los resultados.

Edit:
Código: [Seleccionar]
function GenerarCuadrados () {
// Pintar cuadraditos de modo que se forme un cuadrado:
// Determinar su base y altura:
Lado = random(CuadraditosPorFila)+1;
trace ("Lado: "+Lado);
// Determinar dónde empieza:
FilaInicial = random(CuadraditosPorFila-Lado);
trace ("FilaInicial: "+FilaInicial);
ColumnaInicial = random(CuadraditosPorFila-Lado);
trace ("ColumnaInicial: "+ColumnaInicial);
FilaFinal = FilaInicial+Lado;
ColumnaFinal = ColumnaInicial+Lado;
// Pintar los cuadraditos de esa imagen:
ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
FilaDelPintandose = FilaInicial
do {
ColumnaDelPintandose = ColumnaInicial;
do {
// Averiguar qué cuadradito es:
NroDelCuadradito = (FilaDelPintandose+FilaInicial)*CuadraditosPorFila+ColumnaDelPintandose+ColumnaInicial;
trace ("NroDelCuadradito: "+NroDelCuadradito);
ColorDeCuadradito = new Color("Cuadro0.Cuadradito"+NroDelCuadradito);
ColorDeCuadradito.setRGB(ColorDeImagen);
ColumnaDelPintandose++;
} while (ColumnaDelPintandose <= ColumnaFinal);
FilaDelPintandose++;
} while (FilaDelPintandose <= FilaFinal);
}

Falla menos seguido pero aún falla.

Ejemplo:

Lado: 2
FilaInicial: 0
ColumnaInicial: 2
NroDelCuadradito: 4
NroDelCuadradito: 5
NroDelCuadradito: 6
NroDelCuadradito: 10
NroDelCuadradito: 11
NroDelCuadradito: 12
NroDelCuadradito: 16
NroDelCuadradito: 17
NroDelCuadradito: 18
...Se supone que debió pintar 4 pero pintó 9...

Y en este otro caso:
Lado: 1
FilaInicial: 4
ColumnaInicial: 4
NroDelCuadradito: 56
NroDelCuadradito: 57
NroDelCuadradito: 62
NroDelCuadradito: 63
...Pintó 0.

Voy a poner que el programa informe mejor qué está haciendo.

Edit 2: Hice un par de cambios, lo probé muchas veces y ya no falla.

Los cambios fueron:

- Le quité las sumas "Inicial" a esto:
NroDelCuadradito = (FilaDelPintandose+FilaInicial)*CuadraditosPorFila+ColumnaDelPintandose+ColumnaInicial;

- Cambié las condiciones <= por <.

02 Marzo, 2025, 11:04 am
Respuesta #3

Richard R Richard

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


Ejemplo:

Lado: 2
FilaInicial: 0
ColumnaInicial: 2

Si ,se ve como que pintó uno de 3x3 empezando en la columna 5

Código: [Seleccionar]
FilaFinal = FilaInicial+Lado;
   ColumnaFinal = ColumnaInicial+Lado;

Creo que eso tiene que ser

Código: [Seleccionar]
FilaFinal = FilaInicial+Lado-1;
ColumnaFinal = ColumnaInicial+Lado-1;

Si estoy en fila 1 y dibujo un cuadrado de lado 2 este ocupa parte de la fila 1 y parte de la 2, pero no llega a la fila 3

 
Código: [Seleccionar]
NroDelCuadradito = (FilaDelPintandose+FilaInicial)*CuadraditosPorFila+ColumnaDelPintandose+ColumnaInicial;
         


Eso esta mal si quieres que te devuelva el número de cuadrado x en función de la fila y columna qué maneja el do


Ya he visto la lógica que quieres imponer y vi lo que esta mal,  con un rato de tiempo te paso el código en actionscript, pero no tengo donde ejecutar para saber su esta bien.

Edito


yo ejecutaría el código así

Código: [Seleccionar]
function GenerarCuadrados () {
   // Pintar cuadraditos de modo que se forme un cuadrado:
   // Determinar su base y altura:
   Lado = random(CuadraditosPorFila)+1;
   trace ("Lado: "+Lado);
   // Determinar dónde empieza:
   FilaInicial = random(CuadraditosPorFila-Lado);
   trace ("FilaInicial: "+FilaInicial);
   ColumnaInicial = random(CuadraditosPorFila-Lado);
   trace ("ColumnaInicial: "+ColumnaInicial);
   FilaFinal = FilaInicial+Lado-1;
   ColumnaFinal = ColumnaInicial+Lado-1;
   // Pintar los cuadraditos de esa imagen:
   ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
   FilaDelPintandose = FilaInicial
   do {
      ColumnaDelPintandose = ColumnaInicial;
      do {
         // Averiguar qué cuadradito es:
         NroDelCuadradito = (FilaDelPintandose-1)*CuadraditosPorFila+ColumnaDelPintandose-1;
         trace ("NroDelCuadradito: "+NroDelCuadradito);
         ColorDeCuadradito = new Color("Cuadro0.Cuadradito"+NroDelCuadradito);
         ColorDeCuadradito.setRGB(ColorDeImagen);
         ColumnaDelPintandose++;
      } while (ColumnaDelPintandose <= ColumnaFinal);
      FilaDelPintandose++;
   } while (FilaDelPintandose <= FilaFinal);
}

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

03 Marzo, 2025, 05:24 am
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
A veces tu código falla.

Ya puse la solución.

¿Quieres que te pase MF5? No sé si te andará bien en un Windows muy nuevo, yo tengo el 7.

03 Marzo, 2025, 11:36 am
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si mi último código falla, puedes mostrarme con que parámetros y el dibujo, así  puedo pensar otra posible causa,
Sobre MF5 , ya no tengo soporte, pero he visto que es similar a Javascript, pero tengo que cobinarlo con HTML para ver los resultados,  cuando lea más de los dos temas, seguro podré correr un programa de lógica y sintaxis similar.
Saludos  \(\mathbb {R}^3\)

03 Marzo, 2025, 03:48 pm
Respuesta #6

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Hola estuve probando con javascript

Prueba esto:

Código: [Seleccionar]
function GenerarCuadrados () {
   // Pintar cuadraditos de modo que se forme un cuadrado:
   // Determinar su base y altura:
   Lado = floor(random()*CuadraditosPorFila))+1;
   trace ("Lado: "+Lado);
   // Determinar dónde empieza:
   FilaInicial = floor(random()*(CuadraditosPorFila-Lado))+1;
   trace ("FilaInicial: "+FilaInicial);
   ColumnaInicial = floor(random()*(CuadraditosPorFila-Lado))+1;
   trace ("ColumnaInicial: "+ColumnaInicial);
   FilaFinal = FilaInicial+Lado-1;
   ColumnaFinal = ColumnaInicial+Lado-1;
   // Pintar los cuadraditos de esa imagen:
   ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
   FilaDelPintandose = FilaInicial
   do {
      ColumnaDelPintandose = ColumnaInicial;
      do {
         // Averiguar qué cuadradito es:
         NroDelCuadradito = (FilaDelPintandose-1)*CuadraditosPorFila+ColumnaDelPintandose-1;
         trace ("NroDelCuadradito: "+NroDelCuadradito);
         ColorDeCuadradito = new Color("Cuadro0.Cuadradito"+NroDelCuadradito);
         ColorDeCuadradito.setRGB(ColorDeImagen);
         ColumnaDelPintandose++;
      } while (ColumnaDelPintandose <= ColumnaFinal);
      FilaDelPintandose++;
   } while (FilaDelPintandose <= FilaFinal);
}
Saludos  \(\mathbb {R}^3\)

04 Marzo, 2025, 10:07 am
Respuesta #7

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
puedes mostrarme con que parámetros y el dibujo, así  puedo pensar otra posible causa,
Ok, pero con las correcciones que puse ya está, puedes mirarlas.

Dibujo:

Lo verde oscurillo de abajo es una ventana, no le des bolilla.

Datos (recuerda que casi todo se cuenta desde 0):
Cuadro1 (mal cuadrado negro arriba):
Lado: 5
FilaInicial: 0
ColumnaInicial: 0
NroDelCuadradito: -7
NroDelCuadradito: -6
NroDelCuadradito: -5
NroDelCuadradito: -4
NroDelCuadradito: -3
NroDelCuadradito: -1
NroDelCuadradito: 0
NroDelCuadradito: 1
NroDelCuadradito: 2
NroDelCuadradito: 3
NroDelCuadradito: 5
NroDelCuadradito: 6
NroDelCuadradito: 7
NroDelCuadradito: 8
NroDelCuadradito: 9
NroDelCuadradito: 11
NroDelCuadradito: 12
NroDelCuadradito: 13
NroDelCuadradito: 14
NroDelCuadradito: 15
NroDelCuadradito: 17
NroDelCuadradito: 18
NroDelCuadradito: 19
NroDelCuadradito: 20
NroDelCuadradito: 21

Cuadro8 (rectángulo pequeño rojo en la 3era fila)
Lado: 2
FilaInicial: 0
ColumnaInicial: 2
NroDelCuadradito: -5
NroDelCuadradito: -4
NroDelCuadradito: 1
NroDelCuadradito: 2

Por las dudas:
- Cada cuadrado verde es un cuadro, ahí se forman los dibujos.
- Los cuadros tienen Cuadraditos.
- En cada Cuadro, los Cuadraditos se pinterían de modo que forman un cuadrado.

Hay más ejemplos pero con eso debería bastar.

Citar
Sobre MF5 , ya no tengo soporte
No sé qué significa, te lo paso por privado y luego si quieres te paso esto que estoy haciendo, aunque necesita muchos ajustes.

El último código que pusiste funcionó bien luego de que corrigiera algunos errores de sintaxis porque AS no es exactamente igual.
Código: [Seleccionar]
function GenerarCuadrados () {
   trace (NombreDelCuadro);
   // Pintar cuadraditos de modo que se forme un cuadrado:
   // Determinar su base y altura:
   Lado = Math.floor(Math.random()*CuadraditosPorFila+1);
   trace ("Lado: "+Lado);
   // Determinar dónde empieza:
   FilaInicial = Math.floor(Math.random()*(CuadraditosPorFila-Lado)+1);
   trace ("FilaInicial: "+FilaInicial);
   ColumnaInicial = Math.floor(Math.random()*(CuadraditosPorFila-Lado)+1);
   trace ("ColumnaInicial: "+ColumnaInicial);
   FilaFinal = FilaInicial+Lado-1;
   ColumnaFinal = ColumnaInicial+Lado-1;
   // Pintar los cuadraditos de esa imagen:
   ColorDeImagen = PosiblesColores[random(PosiblesColores.length)];
   FilaDelPintandose = FilaInicial
   do {
      ColumnaDelPintandose = ColumnaInicial;
      do {
         // Averiguar qué cuadradito es:
         NroDelCuadradito = (FilaDelPintandose-1)*CuadraditosPorFila+ColumnaDelPintandose-1;
         trace ("NroDelCuadradito: "+NroDelCuadradito);
ColorDeCuadradito = new Color(NombreDelCuadro+".Cuadradito"+NroDelCuadradito);
         ColorDeCuadradito.setRGB(ColorDeImagen);
         ColumnaDelPintandose++;
      } while (ColumnaDelPintandose <= ColumnaFinal);
      FilaDelPintandose++;
   } while (FilaDelPintandose <= FilaFinal);
}

04 Marzo, 2025, 12:28 pm
Respuesta #8

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 58,907
  • País: es
  • Karma: +0/-0
Hola

 Por favor, Tachikomaia. Haz caso a esto:

Algunas veces te lo corrijo pero otras no tengo tiempo.

Tachikomaia debes de subir las imágenes al foro y no enlazarlas en servidores externos (lo pone en las reglas del foro). Por que si esos servidores se caen o dejan de alojar la imagen, tu mensaje perdería esas ilustraciones.

 Tienes aquí como hacerlo:

https://foro.rinconmatematico.com/index.php?topic=3659.msg14457#msg14457

Por favor corrige tu mensaje.

Saludos.

04 Marzo, 2025, 01:34 pm
Respuesta #9

Richard R Richard

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

El último código que pusiste funcionó bien luego de que corrigiera algunos errores de sintaxis porque AS no es exactamente igual.

Hola, ¿Funcionó bien o hizo la siguiente imagen y numeros
Citar
Ok, pero con las correcciones que puse ya está, puedes mirarlas.

Dibujo:

Lado: 5
FilaInicial: 0
ColumnaInicial: 0
NroDelCuadradito: -7
NroDelCuadradito: -6
NroDelCuadradito: -5
NroDelCuadradito: -4
NroDelCuadradito: -3
NroDelCuadradito: -1



Pues no debería dar números negativos y en todo caso el código hace solo un cuadradito dentro un solo cuadrado verde
Como calculas la posicion del primer cuadradito verde de cada cuadrado?.


Estoy aprendiendo javascript para un proyecto personal, así que no te preocupes por lo de la sintaxis, ya intentaré mejorar.... esto lo corres en un navegador ?Internet explorer por ejemplo


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