2011-12-05 14 views
6

私はスムーズにPostScriptでアニメーションを実行したいと思います。私が望むものを見るために、PostScriptに直接切り替えてみましょう。 Ghostscriptを呼び出し、スムーズなPostScriptアニメーション

200 dup scale .5 setgray 0 0 3 3 rectfill 

現在灰色の正方形を持っています。

0 setgray 0 1 3 1 rectfill 

黒いストライプが入っています。私たちは今、連続しているストライプ、 白と黒の1時間を記入します:

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

あなたは今 は、元のブラックストライプよりも小さく、黒と白の長方形のいくつかのちらつきが表示されます。理想的には、元の灰色の四角形 が表示されます。またはほとんど。今日、どこでそのような機能を利用できますか?

サイズ5の魔法 正方形の検索より面白いアニメーションシーケンスを参照するには、次の私は、これらの問題に対処しようとしなかった数年前

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

を。しかし、ゴーストスクリプトやXfreeには一度も入りませんでした。 this pageを参照してください。たぶんいくつか良いアイデアがありますか?

編集:これまでの回答を読んだ後、ここで1つの問題を明らかにする。基本的に、二つの独立した問題は、この質問であります

  • アニメーションが言語レベルで表示する必要がありますどのように?私は、最善の方法は、各フレームを1つのページとして見ることです。 copypageでは、少ない労力で増分変更を実現できます。悲しいことに、copypageのセマンティクスはレベル1と2にのみ存在します。レベル3では、copypageの意味がshowpageに変更されました。私は何年も前にlittle modification to ghostscriptと表示されているすべての変更をcopypageまたはshowpageまで延期しました。このようにして、変更された領域を含む単一のXCopyAreaが、サーバー上の(つまり、ディスプレイ)にローカルで実行されます。

  • グラフィックスに記載されていない場合のアーチファクトを回避するために、ビジュアルディスプレイの実際の変更を同期させるにはどうすればよいですか?あなたが見る不規則なちらつきは、PostScriptの特権ではありませんが、これまで私が見てきたダブルバッファーシステムには存在するようです。あなたが合っていると思うどんなシステムでもこれをプログラムしようとしてください。

さらに編集:

右の言語レベルを取得するには、それは(ghostscriptのための)レベル1または2行います:

systemdict /.setlanguagelevel known {2 .setlanguagelevel} if 

編集:私はこのコメントを追加していいくつかの新しい投稿者を引き付けるかもしれません。

+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標準のリリース以降、Postscriptはガベージコレクション言語です。フラグメント-2 vmreclaimを使用してユーザーオブジェクトの収集を無効にすることはできますが、それはあまり効果がありません。無効にすることができますALLゴーストスクリプトガベージコレクションは、-dNOGCオプションで起動します。これは、画像の一部が失速したり吐き出されたりするのを防ぐのに役立ちます。

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警備員はあなたが(プリンタなど)ghostscriptの以外の通訳に同じコードを送信することができます。

ディスプレイポストスクリプトサーバーが実際にある場合は、ビジー待機ではなくwait演算子を使用できます。

+0

ここには2つの問題があります。何が見られるべきですか?ディスプレイとのやり取りはどのように行われますか?あなたは前者に興味があります、後者はむしろです。私は、「flushpage」は良い方法ではないと信じています。 'copypage'(すなわち、レベル1と2のセマンティクスのみ)はきれいで論理的な方法です。 – false

+0

それは理にかなっています。私は 'copypage'から私が望む結果を得ていません。それは常に私が欲しくない 'erasepage'を行います。おそらく私のゴーストスクリプトのインストールをアップグレードする必要があります。 –

+0

いいえ!言語レベルを1または2に設定する必要があります。 – false

3

@ luserdroogの答えが気に入っていますが、私はPostscriptをこのような方法でアニメーションに使うべきではないと思います。ウィジェットを実行できる言語やリアルタイムで設計された表示要素表示とユーザの介入 - それはポストスクリプトやゴーストスクリプトの場合ではありません。

しかし、イメージの各変更後にページをレンダリングするだけでなく、外部プログラムを使用してアニメーションフレームとしてアセンブルする目的で、ポストスクリプトをレンダリング目的に使用するといいと思います。 レンダリングエンジンとしてポストスクリプトを使用していても、各フレームをリアルタイムでレンダリングするために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() 

、あなたはPythonとpygameのを持っている必要があります(http://pygame.orgから - そのため、ほとんどのLinuxシステム上の準備のパッケージがあります)

pygameのの描画APIは、PostScriptよりもはるかに劣っている - あなたはより多くを必要とする場合座標系を回転、剪断するなどbezies、スケーリング、回転、剪断などの矩形よりも、Cairo + python +ディスプレイライブラリ(Pygame、GTK +またはqt)を使用する方法があります。カイロはポストスクリプトから継承した2D図面ライブラリです。 - 上記のように、Pythonを使ってghostscriptの外部プロセスを起動し、stdoutまたはramdriveに圧縮されたイメージファイルを生成させ、そのイメージをpython + pygameを使ってフレームごとに読み込んで表示します。

もう1つの選択肢は、HTML5のキャンバスを使用して、ブラウザで表示できるJavascriptですべてを行うことです。 HTML5のCanvasはPostscriptの描画方法も継承しています。

+1

私は1990年頃からアニメーションのためにPostScriptを使っています。これまでのところ、同じ2D機能が可能なプログラミング言語です。ところで、元のプログラムを別のフレームワークでプログラムしようとしましたか?このようなグラフィックスを正確に表示できる**システムがあれば、私は興味があります。 – false

+0

ちょっとしたことをするには:サイズ3x3の灰色の四角形をペイントし、3x1の長方形のストライプを描画し、その矩形の色を常に白から黒に変更します。 – false

+0

私は純粋なpygameでそれを作ることができました - しかし、私は画像を描画するためにゴーストスクリプトを持っていて、次に表示してインタラクティブ機能を追加するレイヤーを思いつくことができたと思うので、ポストスクリプトで描画を続けることができます。 – jsbueno

関連する問題