Creando vectores desde screen$

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
zxbruno
Freddy Hardest
Mensajes: 586
Registrado: Dom Jun 03, 2007 3:28 am
Ubicación: Anaheim, California, USA

Creando vectores desde screen$

Mensaje por zxbruno » Sab Feb 06, 2010 11:38 pm

Hace poco descubrí, gracias a Nathan, rutinas para crear y visualizar vectores. También sé de lo que se ha hecho con z88dk. Pero me gustaría pedirles ayuda para crear una rutina, en codigo maquina o hasta mismo en Basic, sin importar cuan lento sea, para crear vectores a partir de una pantalla screen$ sin atributos. Repito, no importa cuan lento sea. Lo interesante de los vectores es que se pueden conseguir efectos increíbles e imágenes mucho más sorprendentes que las que estamos acostumbrados a ver en aventuras. Recuerdo haber quedado boquiabierto cuando vi un Spectrum dibujando la Mona Lisa, digitalizada, nada más con vectores. Tengo la descripción de la teoría de como hacer tal rutina para el Spectrum, enviada por mi primo. Infelizmente ya no tiene tiempo para programar todo desde cero, y por eso vengo a Speccy.org a pedir ayuda. por ahora voy a dejar la información tal como me fue enviada, en portugues, pero regresaré más tarde para traducir todo al castellano. Saludos.


"1. Varrer o ecran desde o canto superior esquerdo até ao canto inferior direito, por linhas até encontrar um pixel aceso. Se não se encontra nenhum, o ecran está totalmente vectorizado e pode-se terminar o programa.

2. Uma vez encontrado um pixel aceso, criavam-se quatro ciclos. Vou descrever apenas um, mas ateoria é igual para todos. Vou descrever o que percorre a linha de topo do ecran (coordenadas de 0,0 a 255,0). Os restantes três ciclos fazem o mesmo que este mas um é para a coluna de pixels da direita do ecran (coordenadas de 255,0 a 255,191), para a linha do fundo do ecran (coordenadas de 255,191 a0,191) e a coluna da esquerda do ecran (coordenadas de 0,191 a 0,0).

3. A partir do pixel aceso encontrado faço um ciclo de 0 a 255 (este caso, repito, é para demonstrar apenas para a linha superior) e chamo uma rotina para calcular o vector que vai das coordenadas dessepixel encontrado até às coordenadas do ciclos (neste caso, todos os vectores possíveis das coordenadas x,y do pixel aceso até às coordenadas que vão de 0,0 a 255,0). Para isso usei uma rotinade cálculo de linha recta que o próprio Spectrum usa para desenhar as suas linhas rectas mas, em vez de desenhar, fiz com que apenas verificasse o estado dos pixels ao longo da linha. Uma descrição doalgoritmo da linha pode ser encontrado aqui: http://en.wikipedia.org/wiki/Bresenham's_line_algorithm No entanto, como te disse, eu simplesmente baseei o meu algoritmo no algoritmo de desenho das linhas rectas que está na ROM do Spectrum. Pode ser encontrado na página 167 do livro The Complete ROM disassembly (ftp://ftp.worldofspectrum.org/pub/sinclair/books/). A minha rotina ia percorrendo os vectores enquanto encontrava pixels acesos. Assim que encontrava um pixel apagado, devolvia a última coordenada onde tinha encontrado um pixel aceso. Com esta coordenada, calculava o tamanho do vector. Isso é simples:

comprimento=SQR((x2-x1)*(x2-x1)-(y2-y1)*(y2-y1))

x1,y1 são as coordenadas do primeiro pixel encontrado e x2,y2 são as coordenadas do último pixel aceso no vector. Guardava sempre o vector maior que fosse encontrado.Este processo de pesquisa de vectores continua para a coluna à direita, a linha de baixo e a coluna da esquerda do ecran

Imagen

4. Após encontrar o vector mais comprido guardo as suas coordenadas na lista final de vectores a guardar (x1,y1,x2,u2) e elimino essa linha, ou seja, apago a linha que vai de x1,y1 até x2,y2. Depois verifico os 8 pixels que estão à volta do pixel em x2,y2 (agora apagado). Se algum desses pixels estiver aceso, torno x1=x2 e y1=y2 e repito o processo de busca de vectores.

Imagen

5. Se nenhum dos 8 pixels à volta do pixel x2,y2 estiver aceso, volto ao passo número 1.

E pronto, basicamente é isto. Eu tinha algumas opções que podia escolher. Por exemplo, podiamos optar por guardar ou ignorar pixels individuais. Também podia optar por calcular os comprimentos pelo método mais lento mas mais correcto (SQR((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))) ou por um método mais rápido que era o de simplesmente calcular qual dos vectores horizontal (abs(x2-x1)) ou vertical (abs(y2-y1)) era o maior e usar esse como o comprimento do vector.Também tinha opções para fazer vectorizações ortogonais nas quais a busca de vectores ocorria apenas para a esquerda, para a direita, para cima e para baixo do pixel aceso original. Mas pronto. Creio que com esta informação já dá para perceberes qual foi a minha linha de pensamento."

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Creando vectores desde screen$

Mensaje por na_th_an » Lun Feb 08, 2010 9:21 am

El tema de la vectorización es que es un proceso muy costoso, sobre todo en memoria. Teniendo PCs y aplicaciones que ya realizan estos procesos, ¿para qué tener un programa que lo haga en un Spectrum, con los problemas que eso acarrea (¡no sólo de velocidad, sino de memoria!). A mí también me flipan los dibujos vectoriales, pero para conseguir lo que tú quieres te recomendaría usar, por ejemplo, Inkscape, que es gratuíto, salvar el dibujo vectorizado con SVG, y luego usar el conversor/visualizador que hay para spectrum para poder emplearlo desde nuestra máquina preferida. Además, la buena vectorización, la que da buenos resultados de verdad, es mucho más compleja que el método que has expuesto, ya que se emplean procesados para obtener un resultado más estético que, de nuevo, emplean sobre todo mucha memoria.

Avatar de Usuario
jevilon
Manic Miner
Mensajes: 288
Registrado: Mié Jul 23, 2008 1:15 pm
Ubicación: La Rioja

Re: Creando vectores desde screen$

Mensaje por jevilon » Jue Feb 25, 2010 9:31 am

Hombre por esa misma regla de tres... ¿para que desarrollar nuevo soft para Spectrum, teniendo PC's que son mucho mas potentes y que puedes ver juegos hasta en 3D con sonido 5.1?...
Es por puro "amor" al Speccy y por conseguir hacer algo así en un ordenador teóricamente no preparado para estas cosas, un reto

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Creando vectores desde screen$

Mensaje por na_th_an » Mar Mar 02, 2010 11:45 am

No es lo mismo. El objetivo es tener una imagen vectorizada. Es como elegir entre hacer un sprite en el Melbourne Draw o en el Photoshop.

Avatar de Usuario
zxbruno
Freddy Hardest
Mensajes: 586
Registrado: Dom Jun 03, 2007 3:28 am
Ubicación: Anaheim, California, USA

Re: Creando vectores desde screen$

Mensaje por zxbruno » Mié Mar 03, 2010 6:13 am

na_th_an escribió:A mí también me flipan los dibujos vectoriales, pero para conseguir lo que tú quieres te recomendaría usar, por ejemplo, Inkscape, que es gratuíto, salvar el dibujo vectorizado con SVG, y luego usar el conversor/visualizador que hay para spectrum para poder emplearlo desde nuestra máquina preferida.


Te ruego que por favor, cuando puedas, muestres un ejemplo de como hacerlo. No pido un tutorial en YouTube, pero agradecería un tutorial para 'dummies', paso por paso, por favor.

Reconozco que hacerlo en el Spectrum tardaría demasiado, pero como ví el programa haciéndolo allá por 1987, hay algo dentro de mí que desea verlo otra vez, lento y todo. Pero sí no se puede, no se puede.

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Creando vectores desde screen$

Mensaje por na_th_an » Mié Mar 03, 2010 12:39 pm

Bueno, no soy un experto en Inkscape, pero creo (de memoria, porque no lo tengo instalado aquí en el trabajo y hace ya tiempo que lo usé por última vez) que es tan sencillo como cargar directamente una imagen raster (en png, por ejemplo), seleccionarla (haciendo click sobre ella) y entrar en el menú trayectorias y seleccionar "trazar mapa de bits". Con esto la imagen se vectoriza y puedes salvarla en svg. Hace poco en WOS (no recuerdo el hilo, si eso luego lo busco) alguien anunción que había hecho un renderizador de SVG para spectrum, aunque lamentablemente desconozco los detalles de su empleo y los resultados que produce.

Avatar de Usuario
apenao
Jack The Nipper
Mensajes: 154
Registrado: Dom Ene 27, 2008 6:08 pm
Ubicación: Marbella

Re: Creando vectores desde screen$

Mensaje por apenao » Mié Mar 03, 2010 6:57 pm

Creo que este es el post que dices:

http://www.worldofspectrum.org/forums/s ... hp?t=27393

Un saludo

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: Creando vectores desde screen$

Mensaje por na_th_an » Jue Mar 04, 2010 9:47 am

Esa es, gracias :D

Avatar de Usuario
zxbruno
Freddy Hardest
Mensajes: 586
Registrado: Dom Jun 03, 2007 3:28 am
Ubicación: Anaheim, California, USA

Re: Creando vectores desde screen$

Mensaje por zxbruno » Vie Mar 12, 2010 3:48 am

Muchas gracias por la explicación. A ver que consigo hacer con esto....

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 40 invitados