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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Cómo generar todas las "formas" estilo Paint?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cómo generar todas las "formas" estilo Paint?  (Leído 3,663 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.213


Superhacker (es broma xD )


Ver Perfil
¿Cómo generar todas las "formas" estilo Paint?
« en: 6 Abril 2023, 01:06 am »

Aclaraciones:
- El fondo sería blanco y no cuenta como color.
- La idea no es generar todas las imágenes de todos los colores posibles, sino, todas las que sean de 1 color, las que sean de 2, etc, entonces si por ejemplo se genera un cuadro de 2*2 todo azul ya no debe hacerse un cuadro así de un mismo color, aunque sea distinto al azul. A eso me quise referir con "formas" en el título, pero si por ejemplo la forma es una barra de 3*1 compuesta de rojo-naranja-naranja, como si fueran color 1, color 2 y color 2 (122), o oscuro, claro, claro (OCC), entonces se deben generar las variaciones de eso: 112, 121 y 212, es decir... 122 es la que dijimos, 211 no cuenta porque es horizontalmente simétrica a 112, y 221 es eso mismo con respecto a 122.
- Las formas verticalmente simétricas se consideran diferentes entre sí.
- Los colores deben ser distinguibles entre sí y del blanco.
- Los colores pueden ser 1 color oscurecido/aclarado en distinta medida, por ejemplo negro, rojo oscuro, rojo, y rojo claro, o puede ser uno claro y otro oscuro y los intermedios entre ellos, por ejemplo rojo-naranja-amarillo. Se admite un 3er color en eso si es negro, por ejemplo negro, verde oscuro, verde, verde amarillento, amarillo (los 3 colores son negro, verde y amarillo, los otros son intermedios).
- En lo posible, cada forma generada debe poder tener colores distintos, elegidos al azar. Esto no contradice lo anterior, simplemente significa que si por ejemplo se hizo una barra 122 de color rojo-naranja-naranja, o OCC entonces la próxima, estructuralmente distinta, por ejemplo 112, también puede ser distinta en colores, por ejemplo azul-azul-celeste (OOC).

Creo que eso es todo aunque quizá falte algo o haya algo mal... Digamos que lo que más me interesa es que se generen sprites como estos
Que no son tan grandes, tienen sólo 3 colores, y siempre 1 es negro (en esos ejemplos también siempre hay 1 color casi blanco, pero hay otros en que no), pero si se pueden generar sprites más grandes y coloridos no estaría mal  :)

-----------------------------------------------------------------------------

Me autorespondo pero me interesan sus respuestas too y cómo mis métodos podrían mejorar.

-----------------------------------------------------------------------------

El método automático más sencillo aunque defectuoso que se me ocurre es algo así:
Código:
// T representa el tamaño de la pantalla: T*T píxeles. Por ejemplo si T es 1, es una pantalla de 1*1 píxeles.
T = 1
// Momento 1:
Crear una cantidad T*T de variables cuyo valor sea 0 y sus nombres sean VX_Y, de modo que X e Y sean de 1 a T y en ningún nombre de variable sean los 2 iguales que los de otro. Por ejemplo si T es 1, se crearán 1*1 variables, es decir sólo 1, cuyo nombre será V1_1. Si T es 2, se crearán 4: V1_1, V1_2, V2_1 y V2_2. Estas variables representan lugares o píxeles de la pantalla y su valor representa el color: 0 es fondo, 1 es color 1, 2 es color 2, etc.
//
X = T
Y = T
Colores = 1
// Momento 2:
Repetir = "S"
Repetir
Si V(X_Y)<Colores
   V(X_Y)++
   Repetir = "N"
   Ir a momento 3
sino
   V(X_Y)=0
   Si Y>1
      Y--
   sino si X>1
      Y=T
      X--
    sino
      T++
      Repetir = "N"
      Ir a momento 1
mientras Repetir = "S"
// Momento 3
Generar imagen.
Esperar 2 segundos.
Cuando se presione espacio, ir al momento 2.
Puede que haya errores, pero la idea es que se generen todas las combinaciones posibles.
D E F E C T O S :
- Las imágenes se pueden repetir, lo distinto sería su ubicación y/o el tamaño del fondo.
- Las imágenes horizontalmente simétricas a otras ya generadas también se generan.
- La cantidad de colores no aumenta (de momento no pensaré cómo lograrlo, pero la máxima debe ser igual a T-1 creo).
- Los colores usados son siempre los mismos (esto se debería variar en la etapa de generar imagen, que es muy específica del lenguaje usado así que no lo puse, pero es más difícil de lo que pensé. En mi lenguaje un color tiene 3 variables, como en Paint: Cantidad de rojo, de verde y de azul, pero creo que está en código hexadecimal. La cosa es que, no es tan fácil calcular los colores intermedios o cuánto oscurecer/aclarar un color).
Importantes creo que no más...

-----------------------------------------------------------------------------

Me gustaría que fuese algo así:
Se genera 1 pixel, que es considerado el inicial.
Situaciones = 1
// Analizando representa qué situación se está analizando.
Analizando = 1
Se guardan los datos de la situación así: S(Situaciones)V1_1 = V1_1, S(Situaciones)V1_2 = V1_2, etc.
// Momento 1:
Desde el píxel inicial mirar hacia arriba hasta hallar un no-píxel (si no se haya, volver al píxel inicial, moverse 1 píxel a la derecha y repetir el proceso, pero cada vez volver al píxel que fue inicial la última vez, y si se llega al extremo de la hoja, en vez de buscar hacia arriba buscar hacia abajo e irse moviendo a la izquierda. Si se llega al extremo izquierdo de la hoja, mirar hacia arriba y moverse hacia la derecha. Si se vuelve al píxel inicial es porque la hoja ya no tiene fondo, es hora de reiniciar aumentando la cantidad de colores a usar) y se genera 1 ahí.
//
Guardar datos.
Situaciones++
Cargar situación A.
Volver al momento 1.
//
Eh, no, algo está mal, debe recorrer la hoja como dije pero cuando vuelve al punto inicial por 2nda vez (cuando ya la recorrió toda), entonces A++, se carga A y se va al momento 1. Sí, ya sé que está entreverado, es que se me acaba de ocurrir, antes de escribirlo tenía en mente otra cosa. Cuando A>S, la cantidad de colores debe aumentar y "todo" se resetea (asumo que debería escribir momento 1 luego de Colores=1 y al que llamaba momento 1 llamarlo momento 2).

-----------------------------------------------------------------------------

En fin, en realidad pensaba en algo así: Supongamos que tenemos estos píxeles:

Lo hice con Excel porque la cuadrícula de mi Paint está mal, de hecho mi Paint lo está, el de antes (98 o xP) era mejor que el del 7.
Los números muestran dónde se pondría el siguiente píxel, pero:
1- Me refiero a que se pone en el lugar 1, se guarda, se carga la imagen original, se pone un píxel en el 2, y así, no es que se van poniendo en ese orden sin cargar la img anterior.
2- Este método es distinto al anterior... No puede generar píxeles aislados (para los sprites que quería hacer no hay drama, pero para otros sí), y el orden conque se colocan los píxeles me parece mejor pero no sé explicar cual es el proceso. Es como, desde el píxel inicial mirar hacia arriba hasta hallar un píxel (en este caso no habría necesidad de ir hasta el extremo de la hoja), poner uno encima (1), guardar, cargar, poner uno en diagonal-derecha (2) del hallado, guardar, cargar, poner uno a la derecha (3) del hallado, y así... siempre que no haya píxel ya en donde se va a poner. Hacia abajo no es necesario para el pixel de arriba. Hacia la izquierda sí... pero la gracia es que se genere como si analizara como un reloj, así que eso se haría al final.
Este método es mejor, en realidad sí se puede poner píxeles aislados si se considera que el fondo es transparente y que debe ser llenado también. Se puede iniciar conque el fondo sea de color magenta por ejemplo y que se puedan hacer píxeles blancos que representarían fondo.

-----------------------------------------------------------------------------

Finalmente, para hacerlo manualmente recomendaría algo así:

Donde dice Base y está en blanco hay que poner la imagen de 1 pixel.
Donde dice Variaciones y hay números hay que poner las imágenes que agregando 1 pixel contiguo (diagonal se considera también contiguo en este contexto) se puedan generar a partir de Base, una img en cada columna. Los números no se escriben, los puse para que se entienda mejor, cada número representa una img distinta.
Cada img generada es copiada en una nueva fila como indican las flechas, cada una en una fila distinta. Las flechas tampoco se ponen.
Y así sucesivamente. Llega un punto en que se empiezan a repetir, pero hasta donde sé es fácil notarlo.

-----------------------------------------------------------------------------

Si conocen un método mejor o más de uno favor díganme cómo es/son, y/o cómo mejorar los que puse.

Gracias.


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.355


Ver Perfil
Re: ¿Cómo generar todas las "formas" estilo Paint?
« Respuesta #1 en: 16 Abril 2023, 23:21 pm »

Aclaraciones:
- El fondo sería blanco y no cuenta como color.
- La idea no es generar todas las imágenes de todos los colores posibles, sino, todas las que sean de 1 color, las que sean de 2, etc, entonces si por ejemplo se genera un cuadro de 2*2 todo azul ya no debe hacerse un cuadro así de un mismo color, aunque sea distinto al azul. A eso me quise referir con "formas" en el título, pero si por ejemplo la forma es una barra de 3*1 compuesta de rojo-naranja-naranja, como si fueran color 1, color 2 y color 2 (122), o oscuro, claro, claro (OCC), entonces se deben generar las variaciones de eso: 112, 121 y 212, es decir... 122 es la que dijimos, 211 no cuenta porque es horizontalmente simétrica a 112, y 221 es eso mismo con respecto a 122.
- Las formas verticalmente simétricas se consideran diferentes entre sí.
- Los colores deben ser distinguibles entre sí y del blanco.
- Los colores pueden ser 1 color oscurecido/aclarado en distinta medida, por ejemplo negro, rojo oscuro, rojo, y rojo claro, o puede ser uno claro y otro oscuro y los intermedios entre ellos, por ejemplo rojo-naranja-amarillo. Se admite un 3er color en eso si es negro, por ejemplo negro, verde oscuro, verde, verde amarillento, amarillo (los 3 colores son negro, verde y amarillo, los otros son intermedios).
- En lo posible, cada forma generada debe poder tener colores distintos, elegidos al azar. Esto no contradice lo anterior, simplemente significa que si por ejemplo se hizo una barra 122 de color rojo-naranja-naranja, o OCC entonces la próxima, estructuralmente distinta, por ejemplo 112, también puede ser distinta en colores, ....
La primera parte de cualquier programa es obtener una especificación clara y concisa del problema. Tu descripción es un galimatías...

Tú debes limitarte a decir qué necesitas y olvidarte de momento de como se logra. Te comportas en una situación como la siguiente:
Un señor quiere construirse una casa, se reúne con el arquitecto, y en vez de decirle: "Quiero una casa con 3 dormitorios (el principal que esté orientado al este, para ver el amanecer), un baño, el comedor y una cocina, de 'x', 'y' ...  'z' metros cuadrados respectivamente."
Tu lo lías todo y le dices, coges ladrillos y pones unos encima de otros y unos solapando en otros, lo levantas de alto bastante más de lo que yo mido, con agujeros  en el centro (no se ponen ladrillos en ese trozo), se ponen baldosas y ya pondré yo una mesa sillas, un sofá, una cama o lo que yo quiera incluso una alfombra.. y bla...bla.bla..."
...total un lío. por que lo juntas todo. Separa la especificación de la resolución del problema (el qué quieres, del cómo se hace o resuelve). Limítate a la primera parte y deja que la segunda te la explique el profesional...

Si cuando vas al médico por un corte, tienes qué decirle al cirujano como ha de operarte o coserte, lo más probable es que te digan, el profesional soy yo, y sé como hacerlo, cállate y quedará bien, si cualquiera te hace caso quedará mal, con riesgo elevado de infección o cicatrices feas y enormes....

No quita que tu pienses por tí mismo como debería hacerse, pero esa parte guárdatela para tí, por que al escupirla solo confundes todo y queda confuso qué necesitas, porque mezclas el cómo se ha de hacer y es todo un despropósito en el que nadie querrá meterse.

Si eres capaz de ceñirte a describir la especificación de lo que quieres y te olvidas del cómo (olvida esas tonterías de claro u oscuro, existen los colores basados en los canales RGB con valores entre el 0 y el 255, que pueden ser espaciados (por ejemplo a distancias de 16, luego serían 16 valores por canal, luego 16x16x16 colores = 65536 colores o a distancias de 64, entonces serían 4x4x4 = 64 colores).

Si como digo eres capaz de ceñirte a describir lo que necesitas, con claridad y concisión, puedo explicarte como resolver el problema o si es muy breve darte la solución, pero si pones lo que parecen ser condiciones, cuando en realidad estarías intentanto dilucidar como lo resolverías tú, no merece la pena ni leerte... porque no queda nada claro excepto que el problema primordial es que no se entiende tu problema.


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.213


Superhacker (es broma xD )


Ver Perfil
Re: ¿Cómo generar todas las "formas" estilo Paint?
« Respuesta #2 en: 17 Abril 2023, 11:58 am »

La primera parte de cualquier programa es obtener una especificación clara y concisa del problema. Tu descripción es un galimatías...
Pues si tuviera dinero suficiente pagaría por ver cómo harías la descripción tú. Sería muy educativo o muy divertido, vale la pena.

¿Obtener? ¿programa informático (hecho en código) o programa en el sentido de proyecto?
La primera parte de un programa suele ser la definición de variables, cargar un archivo o usar includes. O un comentario que describa qué hace el programa, nada de "obtener" (bueno, puede obtener datos de un archivo si lo carga, o algo así).
Si te refieres a un proyecto, ok. Pero no sé cómo hacer una mejor descripción, o quizá ahora sí, pero en aquél momento no y no me puedo poner a mejorar todo lo que vaya a postear, mejor lo posteo, que tan mal no está me parece.

Citar
Tú debes limitarte a decir qué necesitas y olvidarte de momento de como se logra.
No me parece lógico, si quiero algo pienso cómo lograrlo a menos que tenga muy poca idea y sepa de gente que sí tenga. Se pasan diciendo en el foro que al hacer una consulta hay que decir qué se ha hecho o cual es el obstáculo y vienes tú a decir que hay que preguntar y no pensar por uno mismo cómo hacerlo. WTF.
Comento lo que se me ocurre porque quizá alguien no tiene mucha idea pero leyendo lo que yo escriba me puede aportar algo basado en eso.

Citar
Te comportas en una situación como la siguiente:
Un señor quiere construirse una casa, se reúne con el arquitecto, y en vez de decirle: "Quiero una casa con 3 dormitorios (el principal que esté orientado al este, para ver el amanecer), un baño, el comedor y una cocina, de 'x', 'y' ...  'z' metros cuadrados respectivamente."
Tu lo lías todo y le dices, coges ladrillos y
No, yo describo qué quiero, como me sale, soy como el señor, pero no estoy hablando con un arquitecto sino con gente diversa, algunos que no saben mucho, otros que sí, pero el tema me parece que está bastante bien planteado, es decir, primero la descripción de qué quiero y luego ideas que se me ocurrieron, si alguien quiere responder sin leerlas no hay problema, todos ganan menos quien no entienda que no es necesario leer eso, pero parece claro, no dije que lo fuera.

Citar
por que lo juntas todo. Separa la especificación de la resolución del problema (el
 qué quieres, del cómo se hace o resuelve).
¡Pero si está separado! Puse unas líneas usando signos de menos que abarcan toda la hoja ¿acaso no se ven en tu pantalla? También dije "Me autorespondo pero me interesan sus respuestas too", es decir, que me pueden responder ya, que no era necesario leer más. Debí aclarar que mi "respuesta" era en realidad un intento de responder, o que no era del todo correcta, pero en fin... Puse de modo bastante destacado la palabras DEFECTOS, es obvio que habría, sino ni me molesto en preguntar. Todo esto quita las ganas, se quejan aunque no corresponda quejarse, hacen perder tiempo, energía, etc.

Citar
Limítate a la primera parte y deja que la segunda te la explique el profesional...
¿Debo creer que vendrá alguno a este tema a hacerme la tarea gratis? Si viene alguno, sabrá lo que debe leer y responderá sobre eso, no hay problema. Salvo que sea pro de algo pero no tenga sentido común, es un riesgo que me parece bien correr.

Citar
No quita que tu pienses por tí mismo como debería hacerse, pero esa parte guárdatela para tí
¿No van a responder "¿Y qué es lo que tienes hecho hasta ahora o qué es lo que te complica?"?

Citar
queda confuso qué necesitas
Mira, alguien o un bot dijo esto:
"Este mantra es buenísino

MANTRA CAPACIDAD Y HABILIDAD:
A tal más tal según tal
No y si, ahora o sinó, ahora"


Luego de eso da algunas "explicaciones" de qué quiere decir pero, para mí sigue siendo poco claro, o directamente una locura, expresiones sin significado a las cuales él sí le ve.

Así que, si dices que lo mío es confuso, yo al recordar a ese individuo o a ese bot, pienso, siento, que quizá tienes razón, pero es que de hecho nada necesito, ni siquiera vivir, simplemente me interesa que:
Código:
Quien lea la pregunta del título y las aclaraciones
   si sabe cómo responderla
      que la responda aquí
   sino, si leyendo mis métodos se le ocurre cómo mejorarlos
      que me diga cómo
   sino, si tiene algún conocido que sepa, o le puede preguntar a GP no sé cuanto
      que le muestre este tema y/o me muestre la respuesta     
   sino
      que se divierta y aprenda lo que pueda sin romper las bolas
Pero bueno, me expreso de modo confuso, no se va a entender ni aunque mediante alguna máquina futurística se transmitan mis "pensamientos" directamente a tu cerebro, son oscuros como decía una psiquiatra. C (no "ce", es "q" pero sin la u, joder).

Citar
(olvida esas tonterías de claro u oscuro, existen los colores basados en los canales RGB con valores entre el 0 y el 255, que pueden ser espaciados (por ejemplo a distancias de 16, luego serían 16 valores por canal, luego 16x16x16 colores = 65536 colores o a distancias de 64, entonces serían 4x4x4 = 64 colores).
Pero esas "tonterías" las entiendo y lo que dices no, ahora soy yo a quien le resulta confuso lo que lee.

Sí, conozco eso de RGB, red, green y blue, aunque no lo asocio con canales (para mí son de TV, Youtube o relacionados con recorridos de líquidos). En el Flash que uso es un texto o número hexadecimal de 6 dígitos. 000000=Negro, FF0000=Rojo, en fin, ya sabes, sólo te comento cómo es ahí. En otro foro que uso es igual (acá no sé, no dice código, el que puse dice "purple", no sé si se puede poner code).

No sé a qué llamas espaciados, a mí me suena a liberarles espacio, pero no sé qué significaría liberar espacio de un número. También me suena pero casi nada a aumentar el espacio entre ellos, a distanciarlos, pero tampoco sé qué pintaría aquí. Veo que 16*16 es 256, creo que entiendo a qué te refieres, había pensado algo parecido. Es un método para obtener X colores cuya diferencia en oscuridad sea la misma en cada parte de la serie de colores elegida. Por ejemplo si X es 3, los colores serán 000000, 128,128,128 (este lo debo convertir a hexadecimal) y FFFFFF, ajá... Sí, es un buen método, pero sigo sin ver por qué es tontería hablar de claros y oscuros, es práctico.

Citar
Si como digo eres capaz de ceñirte a describir lo que necesitas, con claridad y concisión, puedo explicarte como resolver el problema o si es muy breve darte la solución, pero si pones lo que parecen ser condiciones, cuando en realidad estarías intentanto dilucidar como lo resolverías tú
¿No es normal decir condiciones? Por ejemplo si te pido que me digas con qué movimientos puedo salir de un jaque, en el fondo es pedir cuales son los movimientos tales que al mover una pieza mi rey no pueda ser destruído en el próximo turno.

Puse condiciones y también lo intenté resolver yo. En fin, sabes mucho de informática creo, recuerdo que me ayudaste con lo de las prioridades de lectura en las sentencias condicionales, no sé si se dice así pero aquí está
https://foro.elhacker.net/programacion_general/duda_sobre_expresiones_condicionales-t485203.0.html;msg2166848#msg2166848
Pero estoy cansado de gente que parece que en vez de colaborar quiere quejarse de cosas que no corresponde y dice que no entiende cosas que están claras (uh, perdón, r>128, g>128 y b>128) y blablabla...

En el futuro, uno podrá decir a una IA: "Da una respuesta troll al siguiente mensaje sin que se note que es troll: Mensaje", podrán trollear dedicando unos minútos a gente a quien le tomará mucho responder a esas cosas, supongo que yo también debería empezar a usar IA, para responder a la gente o... para no tener necesidad de hacerlo.
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