複雑な一連の回転と平行移動を行った後、現在の方向をページの上部を指す「北」に戻したいと思います。どうやってやるの?北に回転
明白な答えは、私が翻訳するたびにどの方向を指しているかを把握することですが、それは多くの作業のようです。私は現在の場所に私を残すが、ページの絶対的なトップを指し示す "0回転"のようなものが欲しい。同様に、「90回転」は右を指す。
また、一連の回転と平行移動の後、ページ上の特定のポイントに移動する方法も知りたいと思います。言い換えれば、私は現在の変換座標に関係なく、特定のポイントに移動する "絶対移動"命令を探しています。
私の目的は、ロゴスタイルのカメを実装することです。カメが認識する2つのコマンドは、setpos(絶対位置に移動する)とsetorientation(絶対方向に回転する)です。これらのコマンドをPostScriptで実装する方法を理解しようとしています。
EDIT 1:ドローグluser
おかげで、しかし何かがまだ間違っています。私の図書館には、以下のようなPostScriptのカメコマンドが含まれています。
init -- %!
/rotateto { ... } bind def
/setpos { ... } def
newpath
306 396 moveto % center 8.5x11 portrait
0 setgray 2 setlinewidth
penup -- % set global variable is_penup to true
pendown -- % set global variable is_penup to false
forward n -- if is_penup then 0 n rmoveto currentpoint translate
else 0 n rlineto currentpoint translate
backward n -- if is_penup then 0 n neg rmoveto currentpoint translate
else 0 n neg rlineto currentpoint translate
right n -- n neg rotate
left n -- n rotate
setpos x y -- x y setpos
setorientation n -- n rotateto
done -- stroke newpage
pos -- get current absolute x y position
orientation -- get current absolute orientation
:rotatetoとsetposはis_penup最初にtrueに設定されたグローバル変数であり、私はまだ亀の現在の絶対XY位置と向きを報告posと方向性を考慮していない、あなたが以前に与えた定義であります
2つの四角形を描画する例を以下に示します。 squareコマンドは長さ50の4行を書き込み、その後にそれぞれ90度の右折を行います。
init
pendown
setpos 100 100
square 50
setpos 400 400
right 45
square 25
done
しかし、これは機能しません。どちらのsetposコマンドも尊重されません。 2つの正方形があり、2つ目の正方形は45度で傾けられていますが、どちらもページの中央から始まります。私がcurrentpointを翻訳するたびにsetposコマンドでやっていることに干渉するのではないかと心配しています。
提案はありますか?
EDIT 2:
私はスキームに現在の位置と方向を返す心配しないことにしました。それは私の現在の目的のためにはあまりにも多くの仕事ですが、将来はいつか役に立つかもしれません。私のスキームコードの最終版を以下に示します。 Sendは共通のユーティリティで、turtle-initはPostScriptのTurtleライブラリを定義し、Scheme Turtleライブラリの残りの部分は次に、2つの四角形を描画するサンプルプログラムを定義します。それはすべて正常に動作します。
(define (send x . xs)
(cond ((null? xs) (display x) (newline))
(else (display x) (display " ") (apply send xs))))
(define (turtle-init)
(for-each send '(
"%!"
"/defmat matrix defaultmatrix def"
"/fix { currentpoint translate } def"
"/rotateto { matrix rotate"
" dup 4 matrix currentmatrix 4 2 getinterval"
" putinterval setmatrix } def"
"/setpos { defmat transform itransform moveto fix } def"
"/left { rotate } def"
"/right { neg rotate } def"
"/is-pendown false def"
"/penup { /is-pendown false def } def"
"/pendown { /is-pendown true def } def"
"/done { stroke showpage } def"
"/init { initgraphics 306 396 moveto fix 0 setgray 2 setlinewidth } def"
"/forward { 0 exch is-pendown { rlineto } { rmoveto } ifelse fix } def"
"/backward { 0 exch is-pendown { rlineto } { rmoveto } ifelse fix } def")))
(define (turtle-penup) (send "penup"))
(define (turtle-pendown) (send "pendown"))
(define (turtle-forward n) (send n "forward"))
(define (turtle-backward n) (send n "backward"))
(define (turtle-right n) (send n "right"))
(define (turtle-left n) (send n "left"))
(define (turtle-setpos x y) (send x y "setpos"))
(define (turtle-setorientation n) (send n "rotateto"))
(define (turtle-done) (send "stroke showpage"))
(define (square n)
(do ((i 4 (- i 1))) ((zero? i))
(turtle-forward n) (turtle-right 90)))
(define (squares)
(turtle-init)
(turtle-pendown)
(turtle-setpos 100 100)
(square 50)
(turtle-setpos 400 400)
(turtle-right 45)
(square 25)
(turtle-done))
(with-output-to-file "squares.ps"
(lambda() (squares)))
これはすべて1月中に私のblogに表示されます。私はまだ正確な日付がわからない。
ありがとうございます!
EDIT 3:
私は戻って、ロゴ亀のドキュメントを読み、setposはペンの現在の状態を尊重することを発見しました。したがって、ペンが停止している場合、setposは古い位置から新しい位置に行を書き出します。私は正しい動作をするためにsetposを変更しました:私はturtle-initも単に定義するのではなくinitを実際に呼び出すようにturpon-initを変更しました。あなたが決してそれを呼び出すことはあまりありません。
どのようにケンブリッジポーランド語から逆ポーランド語に翻訳していますか?あなたは別のプログラムからポストスクリプトを出力していますか? –
ライブラリはSchemeで記述されます。 PostScriptへの翻訳は難しくありません。しかし私が翻訳したいPostScriptを見つけ出すことは問題を引き起こしています。 – user448810
ある種のLispは良い選択のようです。可能であれば、動作しているときに私たちにリンクを与えてください。 :) –