phina.js の Shape での origin による座標計算は padding を含む
メモ
この記事は 2018/7/8 に Qiita へ投稿したものです。
phina.js の小ネタです。
以前に調べて知っていたはずなのに、久しぶりにまた引っかかったので記事に残しておきます。
実のところタイトルがほぼ全てなのですが、それでは寂しいので少し解説を書いてみます。
origin について
Object2D を継承している各クラスは origin で座標の基準を指定することが出来ます。
(0.0, 0.0) で左上が、(0.5, 0.5) で真ん中が、(1.0, 1.0) では右下が基準になります。
0.0 ~ 1.0 の範囲外を指定することで図形の外に基準を置くことも出来ます。
ちなみにデフォルトは (0.5, 0.5) です。
参考: [phina.js-Tips] Shapeの原点を変更する
Shape の origin
ここからが本題です。
RectangleShape などの各 Shape も Object2D を継承していますので、もちろん origin を指定できます。
ただし Shape を継承したクラスの場合は origin による座標の計算時に width や height だけでなく padding も考慮されます。
例えば RectangleShape の場合 origin の (0, 0) は矩形の左上ではなく矩形からさらに padding 分左上の位置になります。
こんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
実行結果:

コードだけ見るとシーン全体を矩形で埋め尽くしそうな気がしますが、実際には padding 分右下にずれて描画されました。
ちなみに padding のデフォルトは 8 です。
padding について
上の例では padding を 0 にすることで矩形がシーンにぴったり重なるようになります。
しかし padding のデフォルトがなぜ 0 ではないのか? あるいはそもそも padding の役割は? といった話はググっても全然ヒットしませんでした。
なので、元の話題からちょっと派生して padding についても簡単に書いておきます。
Shape の派生クラスでは stroke と strokeWidth で枠を描画することが出来ます。
そしてこの枠は strokeWidth の半分の幅で元の図形の外側に描画されます。
例えば、
1 2 3 4 5 6 | |
と指定すると、縦横 100px の矩形の外側に幅 5px の赤い枠が描画されます。
ここでもし padding を 0 にしてしまうと、この赤い枠が描画されなくなります。
なぜなら RectangleShape では、width および height で指定された範囲 + padding 分の領域だけシーンに描画される仕組みになっているためです1。
padding のデフォルトは 8 でしたので、strokeWidth が 16 を超えると、それ以上いくら数字を大きくしても枠は太くなりません2。
この場合 padding をその分大きくすることで描画されるようになります。
なお shadow と shadowBlur を指定する場合も同様です。