回転/スケールの値を見つけるにはどうすればよいですか? たとえば、次のコマンドを発行した後:
90 rotate
現在の回転は 90 に設定されています。どの回転に設定されているかを調べるにはどうすればよいですか?
回転/スケールの値を見つけるにはどうすればよいですか? たとえば、次のコマンドを発行した後:
90 rotate
現在の回転は 90 に設定されています。どの回転に設定されているかを調べるにはどうすればよいですか?
実際に回転、平行移動、および均一なスケーリングしか行っていない場合は、アフィン変換行列 (3x2) を平行移動ベクトル (1x2) と線形変換行列 (2x2) に分解できます。次に、実際には、少しトリガーすると回転が得られます。
そこで、Postscript でこれを行う 1 つの方法を次に示します。CTM ではなく、デフォルト マトリックスを乗算した場合に CTM を生成するマトリックスで操作するために、いくつかのマトリックス操作を行います。回転角度、倍率、平行移動オフセットをこの順序で返します。translate scale rotate
これらの値に演算子シーケンスを適用すると(デフォルト マトリックスが有効な場合)、現在のマトリックスが生成されます。
そして、PSエラーメカニズムを使用して処理できない行列をエレガントに拒否するようにしようとして、少し夢中になりました(標準ではほとんど文書化されていないため、インタープリター間で完全に標準化されていません)。それをテストするために、他の場所からランダム シード コードをいくつか持ち込んでみました。しかし、真ん中に隠れているのはb a atan
、角度を求める比較的単純な式です (ここ[a b c d e f]
で、行列の値の名前、a == d、および b == -c)。
%!
%make Adobe-style interpreters mimic ghostscript's error call
/.error where { pop /signalerror {.error} def } if
%"Safe" seed randomizer
{ 0 4{ 8 bitshift (/dev/random)(r)file read pop add }repeat srand } stopped
{ usertime 10 { %can't open file, chop some vegetables
save 128 string 99 2 getinterval 1 vmreclaim pop restore
} repeat usertime 8 bitshift add srand } if
%translate, scale, rotate
% extracts rotation, scaling and translation parameters
% from the CTM (assuming it's "easy" to do)
%
%eg.
% PS> rand 100 mod %get random number 0..99
% PS> { 1 rotate } repeat %rotate
% PS> tsr 4 pop = %print rotation angle
%
% - tsr theta Sx Sy Tx Ty
/tsr { {
6 dict begin
matrix currentmatrix % get CTM
matrix defaultmatrix % get Default
matrix invertmatrix % get the "undo" of the Default
matrix concatmatrix % CTM * Default^-1 = Default-->CTM
aload pop % dump the matrix components
{/ty/tx/d/c/b/a}{exch def}forall % name the components
a d ne
b neg c ne or %ie. not "Jacobian", not "conformal"
{ [ a b c d tx ty ] /tsr cvx /undefinedresult signalerror } if
b a atan % theta
a a mul b b mul add sqrt dup % Sx Sy (uniform scaling factors)
tx ty % translation
end
exit } loop } def
%1 2 scale resolve %test error trigger
rand 100 mod
{ 1 rotate } repeat
rand 100 mod
{ rand 3 mod .5 add dup scale } repeat
tsr pstack
回転 (スケーリングとせん断も) には個別の値はありません。このような変換はすべて、Current Transformation Matrix (CTM) にまとめられます。
PostScript 言語リファレンス マニュアル、特にセクション 4.3.1 から 4.3.3 で、CTM と変換の優れた説明を見つけることができます。CTM はすべての描画操作を支えているため、PostScript について理解することが重要な領域です。このフォーラムで説明するには本当に複雑すぎると思います。
簡単な答えは、簡単な解決策はないということです。ポイントがどこにマッピングされるかを見つけるには、行列代数を実行する必要があります。一般的なトリックは、CTM (ポイント 0,0 および 1,1) を介して単位正方形の座標を渡し、変換されたポイントがどこに到達するかを確認することです。
これを行う 1 つの可能な方法は、便利な形式で値を追跡するようrotate
にオーバーロードすることです。
/oldrotate /rotate load def
/rotate { dup oldrotate
/currentrotation dup load 3 2 roll add 360 mod store
}
/currentrotation 0 def
setmatrix
残念ながら、またはを使用している場合、これは十分ではありませんgsave ... grestore
。