2011-12-05 47 views
6

Me gustaría ejecutar animaciones en PostScript sin problemas. Para ver lo que quiero, permítame cambiar a PostScript directamente. Llamar a ghostscript, ySmooth PostScript animations

200 dup scale .5 setgray 0 0 3 3 rectfill 

Ahora tenemos un cuadrado gris.

0 setgray 0 1 3 1 rectfill 

Con una franja negra. Ahora vamos a llenar esa raya, una vez blanco y negro en la serie:

{1 setgray 0 1 3 1 rectfill 0 setgray 0 1 3 1 rectfill} loop 

verá ahora algo de parpadeo de rectángulos blancos y negros que son más pequeñas que la franja negro original. Idealmente, veríamos el cuadrado gris original. O casi ¿Dónde puedo obtener esa funcionalidad hoy?

Para ver una secuencia de animación más interesante la búsqueda de cuadrados mágicos de tamaño 5:

wget http://www.complang.tuwien.ac.at/ulrich/gupu/l5.eps.gz 
zcat l5.eps.gz | ghostscript - 

Un par de años me trató de abordar estas cuestiones. Pero nunca entró en ghostscript o Xfree. Ver this page. Tal vez hay algunas mejores ideas ahora?

Editar: Después de leer las respuestas hasta el momento, quiero aclarar un problema aquí. Esencialmente, hay dos cuestiones independientes en esta pregunta:

  • ¿Cómo se debe ver una animación desde el nivel de idioma? Creo que la mejor manera es ver cada cuadro como una sola página. Con copypage, los cambios incrementales se pueden realizar con poco esfuerzo. Tristemente, esa semántica de copypage solo está presente en el Nivel 1 y 2. En el Nivel 3, el significado de copypage cambió a showpage. Lo hice, hace muchos años, un little modification to ghostscript para retrasar todos los cambios visibles hasta copypage o showpage. De esta manera, un solo XCopyArea que contiene el área modificada se realiza localmente en el servidor (es decir, la pantalla).

  • ¿Cómo se deben sincronizar los cambios reales en la pantalla visual para evitar artefactos que, cuando no está presente en los gráficos descritos? El parpadeo irregular que ve no es un privilegio de PostScript, parece estar presente en cualquier sistema de búfer doble que he visto hasta ahora. Solo trata de programar esto en el sistema que mejor te parezca.

Además de edición:

Para obtener el nivel de idioma correcto, es decir el nivel 1 o 2 do (para Ghostscript):

systemdict /.setlanguagelevel known {2 .setlanguagelevel} if 

Editar: Estoy añadiendo este comentario para atraer a algunos nuevos contribuyentes .

+0

Me parece que si desea obtener un "efecto" gris de una serie de muestras blancas y negras, debe sincronizarse con la frecuencia de actualización de la pantalla. A 60 Hz, querrá como máximo 2 "cuadros" de cada uno, 30 Hz por encima del umbral Persistencia de la visión. –

+0

Esto fue solo un ejemplo de prueba donde es evidente lo que debería ser visible y lo que no. Nadie quiere pintar de esa manera (era popular hacerlo con ATARI hace 25 años ...).Lo interesante de esto hoy es ver animaciones discretas como la de arriba (l5.eps) y esto sin ver artefactos que no son parte de la animación. Mírelo: le muestra cómo un programa CLPFD encuentra soluciones a los cuadrados mágicos al enumerar todas las posibilidades ** sistemáticamente **. – false

+1

Hilo reciente sobre [postscript y animación] (https://groups.google.com/forum/#!topic/comp.lang.postscript/olXsoUut2aQ) en un modo * batch *. –

Respuesta

4

Hemos explorado algunas de estas cuestiones en this thread on comp.lang.postscript.

Desde la publicación de la norma de nivel 2, PostScript es un lenguaje de recolección de basura.Puede deshabilitar la colección de objetos de usuario con el fragmento -2 vmreclaim, pero no logra mucho. Puede desactivar ALL colección de basura ghostscript invocando con la opción -dNOGC. Esto debería ayudar a evitar el estancamiento y escupir con partes de la imagen.

Ghostscript tiene un operador no estándar llamado flushpage, que sincroniza la representación con la ejecución. Esto ayuda a asegurarse de que todo esté visto antes de que desaparezca.

- flushpage - 
On displays, flushes any buffered output, so that it is guaranteed to 
show up on the screen; on printers, has no effect 

Y para control de tiempos, no parece ser una manera mejor que la simple ocupado en espera.


/smallpause { 
    /flushpage where{pop flushpage}if 
    50 sleep } def 
/pagepause { 
    /flushpage where{pop flushpage}if 
    1000 sleep } def 

/sleep { 
    usertime add { 
     10 { 
      1 100000 div pop %busy 
      .1 sin 257 cos atan pop %busy busy 
     } repeat 
     dup usertime le {exit}if 
    } loop pop 
} def 

Los where guardias alrededor flushpage le permiten enviar el mismo código para intérpretes distintos de Ghostscript (como una impresora).

Si tenía un servidor real de Postscript Display, podría usar el operador wait en lugar de busy-waiting.

+0

Hay dos problemas aquí. ¿Qué debería verse? ¿Y cómo se realiza la interacción con la pantalla? Usted está interesado en lo primero, prefiero lo último. Creo que 'flushpage' no es una buena forma de hacerlo. 'copypage' (es decir, solo Semántica de Nivel 1 y 2) es la forma limpia y lógica. – false

+0

Eso tiene sentido. No he obtenido los resultados que quería de 'copypage'. Siempre hace una 'erasepage' que no quiero. Probablemente necesito actualizar mi instalación de ghostscript. –

+0

¡No! Debe establecer el nivel de idioma en 1 o 2. – false

3

Aunque me gusta (y voté en contra) la respuesta de @luserdroog, no creo que Postscript deba usarse para animaciones de esta manera; prefiero usar algún lenguaje que pueda ejecutar widgets o mostrar elementos diseñados para tiempo real visualización e interacción del usuario: ese no es el caso de postscript o ghostscript.

Creo que sería bueno, sin embargo, usar PostScript para aimaciones con fines de renderizado: simplemente renderizar una página después de cada modificación en la imagen, y usar un programa externo para ensamblar las diferentes páginas como marcos de animación. Tal vez incluso usando postscript como motor de renderizado, con el proceso en otro idioma llamando a ghostscript para renderizar cada fotograma en tiempo real. Un marco multimedia agradable y fácil de usar que podría ser, por ejemplo, el lenguaje Python con el módulo Pygame.

Aquí hay un breve ejemplo que usa "pure python + pygame".

#! /usr/bin/env python 
# coding: utf-8 

import pygame 

size = 640,480 #(in pixels) 

# multiplying factor so that the whole image is 5 units across 
factor = size[0]/5.0 

# Inits pygame drawing window 
screen = pygame.display.set_mode(size) 

# Rectangle drawing function that scales drawing using the factor above 
def draw_rect(color, rect): 
    new_rect = [int (r * factor) for r in rect] 
    return pygame.draw.rect(screen, color, new_rect) 

def main(): 
    draw_rect((128,128,128), (0, 0, 3, 3)) 
    colors = ((255,255,255), (0,0,0)) 
    color_index = 0 
    while True: 
     draw_rect(colors[color_index], (0, 1, 3, 1)) 
     pygame.display.flip() 
     color_index = 1 - color_index 
     pygame.time.delay(50) # in miliseconds 

try: 
    main() 
finally: 
    pygame.quit() 

Para ejecutar esto, usted tiene que tener Python y Pygame (de http://pygame.org - hay paquetes listos en la mayoría de los sistemas Linux para eso)

API de dibujo de Pygame es mucho más pobre que la posdata - si necesita más que los rectángulos (como bezies, escalar, rotar y esquilar el sistema de coordenadas, etc.), el camino a seguir es usar Cairo + python + alguna biblioteca de pantalla (que podría ser pygame, GTK + o qt). Cairo es una biblioteca de dibujo en 2D que hereda de la forma de postscript. - o, como dije antes, para conducir un proceso externo de Ghostscript usando Python, haciendo que genere un archivo de imagen comprimido para stdout o un ramdrive, y esa imagen sea leída y mostrada cuadro por cuadro usando python + pygame.

Otra opción es utilizar el lienzo de HTML5, y hacer todo en Javascript, visible en un navegador. El Canvas de HTML5 también hereda el modo de dibujo de Postscript.

+1

Estoy usando PostScript para animaciones desde aproximadamente 1990. Hasta ahora, no he visto ninguna otra lenguaje de programación que es capaz de la misma funcionalidad 2D. Por cierto, ¿has intentado programar el programa original en otro marco? Me interesaría ver, si hay ** cualquier ** sistema capaz de mostrar tales gráficos con precisión. – false

+0

Para aclarar las cosas: pintar un cuadrado gris de tamaño 3x3, dibujar una franja de un rectángulo 3x1 a través de él, cambiar el color de ese rectángulo de blanco a negro todo el tiempo. – false

+0

Podría hacerlo en pygame puro, pero creo que podría obtener una capa para tener ghostscript para dibujar las imágenes, y pygame para mostrarlas y agregar interactividad, para que pueda seguir dibujando en PostScript. – jsbueno

Cuestiones relacionadas