このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

CanvasRenderingContext2D: setTransform() メソッド

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.

CanvasRenderingContext2D.setTransform() はキャンバス 2D API のメソッドで、現在の座標変換を恒等行列にリセット(上書き)した後、このメソッドの引数で記述された座標変換を呼び出します。これにより、コンテキストの変倍、回転、移動、歪めを行うことができます。

メモ: transform() メソッドも参照してください。このメソッドは現在の変換行列を上書きせずに、指定された行列と乗算します。

構文

js
setTransform(a, b, c, d, e, f)
setTransform(matrix)

座標変換行列は [acebdf001]\left[ \begin{array}{ccc} a & c & e \ b & d & f \ 0 & 0 & 1 \end{array} \right] として記述されます。

この座標変換行列は、キャンバス上に描画されるそれぞれの点を表す列ベクトルの左側に掛け合わされ、キャンバス上で使用される最終的な座標を生成します。

引数

setTransform() は 2 種類の引数を受け入れます。古い形式では、設定する変換行列の個々の要素を表す複数の引数で構成されます。

a (m11)

行列の 1 行目 1 列目のセルです。

b (m12)

行列の 2 行目 1 列目のセルです。

c (m21)

行列の 1 行目 2 列目のセルです。

d (m22)

行列の 2 行目 2 列目のセルです。

e (m41)

行列の 1 行目 3 列目のセルです。

f (m42)

行列の 2 行目 3 列目のセルです。

あるいは、上記の値をプロパティとして含むオブジェクトを単一の引数として渡すことも可能です。引数名はそのプロパティキーとなります。同義の 2 つの名前(例: m11a)が両方存在する場合、それらは同じ数値でなければならず、そうでない場合、TypeError が発生します。オブジェクト形式を使用すると、一部の引数を省略できます 。 ad はデフォルトで 1、その他はデフォルトで 0 となります。

もともと (x,y)(x, y) の座標を持つ点があった場合、座標変換後は座標が (ax+cy+e,bx+dy+f)(ax + cy + e, bx + dy + f) となります。すなわち、

  • ef はコンテキストの水平方向および垂直方向の移動を制御します。
  • bc0 の場合、ad がコンテキストの水平方向および垂直方向の変倍を制御します。
  • ad1 の場合、bc はコンテキストの水平方向および垂直方向の歪めを制御します。

返値

なし (undefined)。

図形の歪め

この例では、矩形を垂直方向 (.2) と水平方向 (.8) の両方に歪ませています。倍率と平行移動は変更されません。

HTML

html
<canvas id="canvas"></canvas>

JavaScript

js
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

ctx.setTransform(1, 0.2, 0.8, 1, 0, 0);
ctx.fillRect(0, 0, 100, 100);

結果

DOMMatrix オブジェクトの受け渡し

次の例では、2 つの <canvas> 要素があります。最初の要素のコンテキストに対して、最初の種類の setTransform() を使用して座標変換を適用し、その上に矩形を描画します。その後、CanvasRenderingContext2D.getTransform() を使用してその行列を取得します。

次に、取得した行列を直接 2 番目のキャンバスコンテキストに適用します。具体的には DOMMatrix オブジェクトを setTransform()(すなわち 2 番目の型)に直接渡し、その上に円を描画します。

HTML

html
<!-- 最初のキャンバス (ctx1) -->
<canvas width="240"></canvas>
<!-- 二番目のキャンバス (ctx2) -->
<canvas width="240"></canvas>

CSS

css
canvas {
  border: 1px solid black;
}

JavaScript

js
const canvases = document.querySelectorAll("canvas");
const ctx1 = canvases[0].getContext("2d");
const ctx2 = canvases[1].getContext("2d");

ctx1.setTransform(1, 0.2, 0.8, 1, 0, 0);
ctx1.fillRect(25, 25, 50, 50);

let storedTransform = ctx1.getTransform();
console.log(storedTransform);

ctx2.setTransform(storedTransform);
ctx2.beginPath();
ctx2.arc(50, 50, 50, 0, 2 * Math.PI);
ctx2.fill();

結果

仕様書

Specification
HTML
# dom-context-2d-settransform-dev

ブラウザーの互換性

関連情報