2011-12-05 3 views
6

애니메이션을 PostScript로 부드럽게 실행하고 싶습니다. 내가 원하는 것을보기 위해 직접 PostScript로 전환하도록하겠습니다. 고스트 스크립트 호출 및부드러운 포스트 스크립트 애니메이션

200 dup scale .5 setgray 0 0 3 3 rectfill 

이제 회색 사각형이 나타납니다.

0 setgray 0 1 3 1 rectfill 

검은 색 줄무늬가 있습니다. 우리는 지금 연속적으로 그 스트라이프, 흰색과 검은 색 한 시간을 채울 것입니다 :

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

이제 원래 검은 색 스트라이프보다 작은 검은 색과 흰색 사각형의 일부 깜박 거림을 볼 수 있습니다. 이상적으로는 원래 회색 사각형 이 표시됩니다. 또는 거의. 오늘 어디서 그런 기능을 사용할 수 있습니까?

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

몇 년 전에 나는이 문제를 해결하기 위해 시도 않았다

는 더 재미있는 애니메이션 시퀀스의 크기가 5의 마법 사각형 검색 참조하십시오. 그러나 그것은 결코 유령이나 Xfree에 들어 가지 않았습니다. this page을 참조하십시오. 어쩌면 지금 더 좋은 아이디어가 있을까요?

편집 : 지금까지의 답변을 읽은 후에 여기에서 한 가지 문제를 명확히하겠습니다. 본질적으로이 질문에는 두 가지 독립적 인 문제가 있습니다.

  • 애니메이션을 언어 수준에서 어떻게보아야합니까? 가장 좋은 방법은 각 프레임을 단일 페이지로 보는 것입니다. copypage을 사용하면 적은 노력으로 점증적인 변경을 실현할 수 있습니다. 슬프게도, 그 의미는 copypage은 레벨 1과 2에만 존재합니다. 레벨 3에서는 copypage의 의미가 showpage으로 변경되었습니다. 나는 수년 전 - little modification to ghostscript을 사용하여 표시되는 모든 변경 사항을 copypage 또는 showpage까지 지연합니다. 이 방법으로 변경된 영역을 포함하는 단일 XCopyArea이 서버 (즉, 디스플레이)에 로컬로으로 수행됩니다.

  • 묘사 된 그래픽에없는 부분의 인공물을 피하기 위해 시각적 디스플레이의 실제 변경 사항을 동기화해야합니다. 당신이 볼 수있는 불규칙한 깜박임은 PostScript의 특권이 아니며 지금까지 본 이중 버퍼 시스템에있는 것처럼 보입니다. 당신이 적합하다고 생각하는 모든 시스템에서 이것을 프로그램하려고하십시오.

또한 편집 :

systemdict /.setlanguagelevel known {2 .setlanguagelevel} if 

편집 : 나는이 댓글을 추가하고

올바른 언어 수준을 얻으려면, 그 (고스트 스크립트의 경우) 레벨 1 또는 2 할 일이다 새로운 명의 기고자를 유치 할 수도 있습니다.

+0

일련의 흰색 및 검은 색 견본에서 회색 "효과"를 얻고 싶다면 디스플레이의 재생 빈도와 동기화해야합니다. 60hz에서, 각각의 최대 2 "프레임"을 원할 것입니다. 30hz는 Persistence of Vision 임계 값 바로 위에 있습니다. –

+0

이것은 무엇이 보이고 무엇이 있어야하는지 분명하게 드러나는 테스트 예제 일뿐입니다. 아무도 그렇게 회색으로 페인트하고 싶지 않습니다. (그것은 25 년 전에 ATARI에서 그렇게 인기가있었습니다 ...).여기서 흥미로운 점은 위와 같은 이산 애니메이션 (l5.eps)과 애니메이션의 일부가 아닌 인공물을 보지 않고이 애니메이션을 보는 것입니다. CLPFD 프로그램이 모든 가능성을 체계적으로 나열하여 마법의 사각형에 대한 해결책을 찾는 방법을 보여줍니다 **. – false

+1

* 배치 모드에서 [포스트 스크립트 및 애니메이션] (https://groups.google.com/forum/#!topic/comp.lang.postscript/olXsoUut2aQ)에 관한 최근 스레드. –

답변

4

우리는이 문제 중 일부를 this thread on comp.lang.postscript에서 조사했습니다.

포스트 스크립트는 수준 2 표준이 릴리스 된 이후 가비지 수집 언어입니다.-2 vmreclaim 조각을 사용하여 사용자 개체 컬렉션을 사용하지 않도록 설정할 수는 있지만 많이 수행하지는 않습니다. -dNOGC 옵션으로 호출하여 ALL 고스트 스크립트 가비지 수집을 비활성화 할 수 있습니다. 이렇게하면 이미지의 일부가 스톨 및 침을 흘리는 것을 방지 할 수 있습니다.

Ghostscript에는 렌더링과 실행을 동기화하는 flushpage이라는 비표준 연산자가 있습니다. 이렇게하면 모든 것이 으로 표시되고으로 표시됩니다.

- flushpage - 
On displays, flushes any buffered output, so that it is guaranteed to 
show up on the screen; on printers, has no effect 
그리고 타이밍 제어를위한 간단한 바쁜 대기보다 더 나은 방법이있을 것 같지 않습니다. flushpage 주위


/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 

where 가드는 (프린터 등) 고스트 이외의 통역에 동일한 코드를 보낼 수 있습니다.

실제 Display Postscript 서버가있는 경우에는 busy-waiting 대신 wait 연산자를 사용할 수 있습니다.

+0

두 가지 문제가 있습니다. 무엇을보아야합니까? 디스플레이와의 상호 작용은 어떻게 수행됩니까? 당신은 전자에 관심이 있습니다, 저는 후자를 선호합니다. 나는'flushpage'가 좋은 방법이 아니라고 생각합니다. 'copypage' (즉, 레벨 1과 2 의미론 만)는 깨끗하고 논리적 인 방법입니다. – false

+0

그건 의미가 있습니다. 나는'copypage'에서 내가 원하는 결과를 얻지 못했습니다. 그것은 항상 원하지 않는'erasepage'를합니다. 아마도 고스트 스크립트 설치를 업그레이드해야합니다. –

+0

아니요! 언어 레벨을 1 또는 2로 설정해야합니다. – false

3

@ luserdroog의 답변이 마음에 들지만, 저는 포스트 스크립트가 이런 식으로 애니메이션에 사용되어야한다고 생각하지 않습니다. 저는 실시간으로 디자인 된 위젯이나 디스플레이 요소를 실행할 수있는 언어를 사용하고 싶습니다. 디스플레이 및 사용자 인터랙션 - 포스트 스크립트 또는 고스트 스크립트의 경우는 아닙니다.

이미지를 수정 한 후 페이지를 렌더링하고 외부 프로그램을 사용하여 애니메이션 프레임으로 다른 페이지를 어셈블하는 목적으로 포스트 스크립트를 렌더링 목적으로 사용하는 것이 좋습니다. 렌더링 엔진으로 포스트 스크립트를 사용하는 경우조차도, 각 프레임을 실시간으로 렌더링하기 위해 고스트 스크립트 (ghostscript)를 호출하는 다른 언어로 된 프로세스를 사용합니다. 멋지고 사용하기 쉬운 멀티미디어 프레임 워크는 Pygame 모듈이있는 Python 언어 일 수 있습니다.

다음은 "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() 

이를 실행하려면, 당신은 파이썬과 파이 게임이 있어야 (http://pygame.org에서 - 준비 패키지가 가장 리눅스 시스템에있다)

파이 게임의 드로잉 API는 포스트 스크립트보다 훨씬 가난한 - 당신이 더 필요한 경우 (bezies, scaling, 좌표계의 회전 및 절단과 같은) 보다 길면 카이로 + 파이썬 + 일부 디스플레이 라이브러리 (파이 게임, GTK + 또는 qt)가 사용됩니다. Cairo는 포스트 스크립트 방식으로 상속받은 2D 드로잉 라이브러리입니다. - 또는 위에서 말했듯이, 파이썬을 사용하여 ghostscript 외부 프로세스를 구동하고, 압축 된 이미지 파일을 stdout 또는 ramdrive로 생성하고, 이미지를 파이썬 + 파이 게임을 사용하여 프레임별로 읽고 표시합니다.

또 다른 옵션은 HTML5의 캔버스를 사용하고 브라우저에서 볼 수있는 자바 스크립트로 모든 작업을 수행하는 것입니다. HTML5의 Canvas는 Postscript 그리기 방법을 상속받습니다.

+1

저는 1990 년 이후로 애니메이션 용으로 PostScript를 사용하고 있습니다. 지금까지는 다른 하나는 보지 못했습니다. 동일한 2D 기능을 수행 할 수있는 프로그래밍 언어입니다. BTW, 다른 프레임 워크에서 원래 프로그램을 프로그램하려고 했습니까? 그러한 그래픽을 정확하게 표시 할 수있는 ** 시스템 **이 있다면 나는 흥미로울 것입니다. – false

+0

그냥 분명히하기 위해서 : 3x3 크기의 회색 사각형을 페인트하고, 3x1 직사각형의 줄무늬를 그려서 그 사각형의 색상을 항상 흰색에서 검정색으로 변경하십시오. – false

+0

순수 파이 게임에서 만들 수 있습니다.하지만 고스트 스크립트를 사용하여 이미지를 그리는 레이어를 만들 수 있었고, 파이 게임으로 표시하고 대화 형 기능을 추가 할 수 있었기 때문에 포스트 스크립트로 그리기를 유지할 수있었습니다. – jsbueno

관련 문제