Quantcast
Channel: 円周率近似値の日に生まれて理系じゃないわけないだろ! - knifeのblog
Viewing all articles
Browse latest Browse all 5376

HTML5+JavaScriptで回転

$
0
0

昨日の恵方の画像をHTML5 + JavaScriptで描いたということで、その辺についてちょっと書いてみる。

x-y座標と、極座標とか数学では使うけど、難しい話は無しにして、最低でも三角関数の sin と cos や、弧度法(ラジアン)は知らなければならないだろう。

以下、

var ctx = canvas.getContext('2d');

として、話を進める。


HTML5では ctx.moveTo(x,y); と ctx.lineTo(x,y); を使って、直線を描くことが出来る。

今までの私の頭のなかでは、(x, y)を中心とする長さlの放射線を描くならば、

ctx.moveTo(x, y);
ctx.lineTo(x+l*Math.cos(deg*Math.PI/180.0), y-l*Math.sin(deg*Marh.PI/180.0));

と角度degを変化させて描いたことだろう。

確かに間違いではないし、こういうことなんだろうけど、これが d=0 のときに、どの方向なのかって、数学に慣れ親しんだ人間や、ゲームプログラミングなどで使い慣れた人間にしか解りにくいだろう。

いや、慣れ親しんでいる私も頭がこんがらがるのである。


HTML5の場合、デフォルトでは原点(0, 0)は左上角にあり、右方向でxが増加し、下方向でyが増加する。

つまり、0時を0度として、時計回りに回転させたいならば、

ctx.lineTo(x+l*Math.sin(deg*Math.PI/180.0), y-l*Math.cos(deg*Marh.PI/180.0));

といったようになるのだが、やっぱり、どっちが sin で cos で、符号は + だっけ - だっけとなってしまうのである。


さて、今回の恵方の図では、文字を回転させたりしていましたね。

これも踏まえると、先のやり方では、放射線は描けても、文字の回転には使えない。

そこで ctx.rotate(rad); を使うのである。

ratateメソッドは、rad度(ラジアン)回転させたものを描いてくれるので、直線などの図形や、文字の回転に使えるわけである。

さて、そうなると回転軸の中心を左上角から移動させるのに ctx.translate(x, y); をすることになる。

24分割のあたりの実際のコードは、

var s=new Array('子','癸','丑','艮','寅','甲','卯','乙','辰','巽','巳','丙','午','丁','未','坤','申','庚','酉','辛','戌','乾','亥','壬');

ctx.translate(200, 200);

ctx.lineWidth = 1.5;
ctx.strokeStyle = 'rgba(0, 0, 0, 0.7)';
ctx.fillStyle = 'rgba(0, 0, 0, 0.7)';

ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.font = '26pt Gothic';

ctx.beginPath();
ctx.arc(0, 0, 198, 0, 2*Math.PI, false);
ctx.closePath();
ctx.stroke();

ctx.beginPath();
ctx.arc(0, 0, 158, 0, 2*Math.PI, false);
ctx.closePath();
ctx.stroke();

for (var i=0; i<24; i++) {
ctx.beginPath();
ctx.fillText(s[i], 0, -178);
ctx.closePath();
ctx.fill();

ctx.rotate(7.5*Math.PI/180.0);

ctx.beginPath();
ctx.moveTo(0, -158);
ctx.lineTo(0, -198);
ctx.closePath();
ctx.stroke();

ctx.rotate(7.5*Math.PI/180.0);
}

こんな感じで、一切三角関数を使わずに記述できるのである。

ところで、translateメソッドも、rotateメソッドも、累積されているので、現状どうなっているのかが解りにくい。

リセットするには、setTransformメソッドを使って、単位行列を設定って、難しい話は無しだったな。

ctx.setTransform(1, 0, 0, 1, 0, 0);

これで、初期化できるんでないのかな。

まぁ、おまじないみたいなものかな。


話は変わるが、まったくHTML5を触ったことがない頃に、描画しても画像にジャギーがでていやだなぁって思ってたんですが、αチャネルで透明度を設定したら、アンチエイリアスされた感じになるのね。

まぁ、本を買ってまで勉強するって感じじゃないサンデープラグラマの戯言ですんで、よくわかってないってのが本当のところなんだろうね。


Viewing all articles
Browse latest Browse all 5376

Trending Articles