2012-07-04 7 views
11

私は0,0の中心X、Yの周りにグラフを描いています。レンダリングが終わると、translateで位置を変更し、スケールを使用してグラフをキャンバスに塗りつぶします(つまり、すべてを50%スケールします)。HTML 5キャンバスの理解とスケッチの翻訳

スケールを呼び出して翻訳したり、翻訳してから拡大縮小したりしても、私はそれを気にすることができません。これは問題があります。なぜなら、すべてが必ずしも適合しないからです。私のメンタルモデルは完全ではないので、それを修正するのは難しいです。

誰かがスケールの順序と呼び出しを変換する理由を説明できますか?

答えて

16

それでは、300×300キャンバスにグリッドを描画してみましょう:

http://jsfiddle.net/simonsarris/4uaZy/

enter image description here

これが行います。特にない。赤い線は(0,0)を通って非常に遠くまで伸びることによって原点がどこにあるかを示しています。それで翻訳すると何かが見えます。ここの原点は左上隅で、赤い線は(0,0)で出会う。

グリッドを描画する前に以下のすべての翻訳が行われるため、グリッドを移動します。これは、あなたが起きていることを正確に見ることができます。


だから、右の+、それを下に動かし、100100でキャンバスを翻訳することができます:

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/1/

だから我々は、赤いXがどこであるの原点を、翻訳しました中心に置かれた。元は100,100になりました。


これで翻訳してからスケールします。原点が最後の画像と同じ場所にあることに注目してください。すべてがちょうど2倍の大きさです。

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/2/

ブーム。 orginはまだ100,100です。しかし、すべてが2で膨らんだ。起源が変わった、そしてすべてがうまくいった。


ここでそれらを逆に見てみましょう。今回は第1のスケールなので、すべてが最初から太っている:

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/3/

すべては、原点は、0,0にその出発点である2によりパフれます。


ここでスケールを作成して翻訳します。

enter image description here

http://jsfiddle.net/simonsarris/4uaZy/4/

我々はまだ100100で翻訳していますが、起源は、実際のピクセルで200200で移動しています。これを前の2枚の画像と比較する。

これは、スケールの後に起こるすべてのものが、追加の変換を含めて、スケールがであるためです。だから、200は、ここで覚えておくべき持ち帰り事が変換を変更すると、物事が描かれている方法に影響を与えるということである(または形質転換は!)そして、上から


、スケールキャンバスは200で動くことにつながる上(100100)によって変換します。

https://github.com/simonsarris/Canvas-tutorials/blob/master/transform.js

:あなたはX2をスケーリングして、翻訳した場合、変換はあなたが見たい場合は

は、数学的に、各ステップで何が起こっているのか、私はここにコードを見てみることをお勧め×2となります

これは、キャンバスによって行われた変換プロセス全体を模倣し、以前のトランスフォームが後で変換されるものをどのように変更するかを見ることができます。

+0

優秀な説明。今すぐ明らかにそうだ:) – DougN

+0

まあ、何かがまだ意味をなさない。これを見てください:http://jsfiddle.net/sdJ7v/1/試行錯誤は私が緑の中に青い円の中心を置くのを助けました。しかし座標が与えられると、そのオフセットは意味をなさない。変換がどのように適用されているかわからない... – DougN

+1

私のコメントをここに見てください:http://jsfiddle.net/simonsarris/sdJ7v/2/それは意味がありますか? –

2

拡大縮小と回転は原点に対して行われるため、変換に変換がある場合などは、これで順序が重要になります。相続人

良い読み物: Why Transformation Order Is Significant

+0

おっと、私が翻訳を意味するとき、私は変形を言った。一定。私は記事を読んだが、まだそれを取得していない。 「拡大縮小は原点に対して行われる」という意味は何ですか?なぜ原点がどこにあるのかをすべて50%スケールするとどうなるのですか? – DougN

+1

@DougN事が収縮したり成長したりすると、飛行機の一点の周りで収縮するか成長するので問題になります。その点があなたのキャンバスの中心にある場合、50%のスケーリングは "unzoom"のようなものです。左上にある場合、キャンバス内のすべてがその点に50%近く移動します。可視領域外であれば、あなたが見ているものは、それがその点に50%近く移動するときに、画面外に移動する可能性があります。別の言い方をすると、元のピクセルだけが純粋に縮尺され、残りの縮尺*と*は開始位置に対して平行移動します。 –