はじめに

HTML5から追加された
canvas要素を用いた図形の描画や,ラスタデータ(2次元配列)を用いた数値計算の実行,計算結果の図示等,
あらゆる用途に使用できるテンプレートを作成しました.
本テンプレートは
HTML+
JavaScriptで構成されています.今回は
HTMLと
JavaScriptがちょっと書ける人向けの内容となります.
この説明だけではまだイメージできないかもしれないのでここに
サンプルを用意しました.
みんな大好きライフゲームです.
Q.何の役に立つのか
ちょっとした画像処理だったり,偏微分方程式の数値解析だったり,頭の中で実装方法がイメージできていても計算をするまでの土台を作るのに結構苦労したりするんですよねえ.
そしてこの作業がまた結構時間を食うんです.
こうしたテンプレートを用意しておくことで,思いつきでパっと実装することが可能になります.実装の容易さを確保しておくことで思考に回すパワーを温存でき,技術開発が捗るという訳です.
しばらくはこれを自分で使ってみたいと思います.ブラウザで実行できるのでご自身のサイトに埋め込んでWebアプリとして公開することも可能ですよ.
配布ページ
免責事項
- データの使用による損害に対しては当方は一切責任を負わないこととします
利用条件
推奨ブラウザ
まあ,ほとんどJavaScriptの標準関数を組み合わせて整理しただけな物なので,どうぞご自由に使ってくださいって感じです.
HTML + JS ファイルはこちら
OneDrive
使い方
ZIPファイルを解凍すると下図のようなファイルが展開されます.

編集が必要なファイルは
"RasterCalculator.html"となります.テキストエディタで開いて編集を開始します.おススメは
サクラエディタです.
テキストエディタで
"RasterCalculator.html"を開くと,以下の様なスクリプトが表示されます.
内容は大まかに5つのセクションに分けて記述されています.それぞれのセクションの場所とざっくりな役割は下図の通りです.

以下の説明では,これらの表記でスクリプト内の場所を示していくので覚えておいてください.
- ①HTML文
- ②Define
- ③Initialize
- ④SetEvent
- ⑤DrawLoop
ここで一旦,
"RasterCalculator.html"をブラウザで開いて確認してみましょう.

はい,真っ暗ですね.何もしてないので当然です.それではここに何か図形を描画してみましょう.
③Initializeに
DrawDot関数を追加してみます.
//Initialize---------------------------------------------------------------------------------------
//キャンバスの初期状態を定義
function InitCanvas()
{
//座標(200, 200)に赤色(255, 0, 0)のドットを描画する
DrawDot(200, 200, 255, 0, 0);
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
//全てのピクセルに対して行う処理ここに書く
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
}
//キャンバスの初期化
function Initialize()
{
ResetCanvas();
Frame = 0;
Stop();
InitCanvas();
}
Initialize();
そしてこれの実行結果がこちらです.
DrawDot関数は指定した座標のピクセルに指定の色を描画する関数となります.座標は左上が(0, 0)です.
また,色の指定は24ビットRGBカラーで指定します.R, G, Bにはそれぞれ0~255の値が入ります.

次にキャンバス全体を好きな色で塗りつぶしてみましょう.先ほどはfor文の外に
DrawDot関数を書きましたが,今度はfor文内に
DrawDot関数を記述してみましょう.
今回は全体に色を塗りたいので座標値はfor文のループ変数(X, Y)としてやります.
//Initialize---------------------------------------------------------------------------------------
//キャンバスの初期状態を定義
function InitCanvas()
{
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
DrawDot(X, Y, 0, 0, 255);
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
}
//キャンバスの初期化
function Initialize()
{
ResetCanvas();
Frame = 0;
Stop();
InitCanvas();
}
Initialize();
実行結果はこんな感じです.

少し遊んでみましょう.次は座標値で色を変えてみたいので色を(X, 0, Y)としてみます.
//Initialize---------------------------------------------------------------------------------------
//キャンバスの初期状態を定義
function InitCanvas()
{
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
DrawDot(X, Y, X, 0, Y);
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
}
//キャンバスの初期化
function Initialize()
{
ResetCanvas();
Frame = 0;
Stop();
InitCanvas();
}
Initialize();
綺麗なグラデーションができました.

ここだけでも結構遊べます.そうですね,次はグリッドなんか引いてみましょうか.
//Initialize---------------------------------------------------------------------------------------
//キャンバスの初期状態を定義
function InitCanvas()
{
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
if(X % 30 == 0 || Y % 30 == 0)
{
DrawDot(X, Y, 0, 255, 0);
}
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
}
//キャンバスの初期化
function Initialize()
{
ResetCanvas();
Frame = 0;
Stop();
InitCanvas();
}
Initialize();
こんな感じになります.

まあ,遊ぶのはこの辺までにして次に進んでいきたいと思います.
ここまでキャンバスの初期状態の設定方法を解説しました.しかし,この状態で再生ボタンを押しても真っ黒になるだけで何も起こらないので,次はアニメーション処理をしてみましょう.
今度は1フレーム毎に処理をしていきたいので
⑤DrawLoopに処理を記述していきます.処理の書き方は
③Initializeに書くときと変わりません.
折角なので時間で変わる何かをしたいと思います.同じく
DrawDot関数を使っていきますが,座標値を(Frame, Frame)としてみます.
//DrawLoop-----------------------------------------------------------------------------------------
function DrawCanvas()
{
//キャンバスを毎フレームリセットする
ResetCanvas();
DrawDot(Frame, Frame, 255, 255, 255);
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
//全てのピクセルに対して行う処理ここに書く
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
Frame++;
//ヘッダー情報更新
ApplyInfo();
}
[再生ボタン]をクリックすると白い点が左上から右下に移動していく様子が見えると思います.ちなみに
ちょっと前に設定した③Initializeの処理は邪魔なので全部消してます.

ここで,スクリプト中の
ResetCanvas()をコメントアウトで消してみてください.ある変化が起きます.
//DrawLoop-----------------------------------------------------------------------------------------
function DrawCanvas()
{
//キャンバスを毎フレームリセットする
//ResetCanvas();
DrawDot(Frame, Frame, 255, 255, 255);
for(var Y = 0; Y < CanvasHeight; Y++)
{
for(var X = 0; X < CanvasWidth; X++)
{
//全てのピクセルに対して行う処理ここに書く
}
}
//Draw関数で定義した色(配列情報)をキャンバスに反映する
ApplyImageArray();
Frame++;
//ヘッダー情報更新
ApplyInfo();
}
今度は点の移動した軌跡が残っていきます.
ResetCanvas関数はキャンバス全体を黒で塗りつぶす処理をします.
毎フレーム黒の塗りつぶしでリセットしたくないときはこのように
ResetCanvas関数を消去してください.

ここまで最低限の使い方を解説しました.細かいことは
リファレンスマニュアルを確認してください.
と,本当はここに「画像ファイルの読み込み処理」を解説してやりたかったんですが,
結論から言いますと作れませんでした.
画像ファイルを読み込んでキャンバスに描画するところまでは簡単にできるのですが,その画像の情報を配列データとして取得することができないんです.
どうやらセキュリティ上の都合でローカルファイルから取得できる情報には制限がかかっている様なんです.色々試してみても回避できなかったので一旦は諦めることにしました.
いやあ,滅茶苦茶悔しいんですよこれ.だって画像に色んなフィルタかける使い方とか色々あるでしょう.それができなくなるということはラスタ計算機としての価値が半減してしまうということなんですよ.
まあ,何かいい方法あったら追記したいと思います.とりあえず画像が読み込めなくても使い道はあるので.
リファレンスマニュアル
リファレンスマニュアル(笑)です.全体的な仕様や,用意している関数の説明をしたいと思います.
使用している変数
よく使いそうな変数だけ記しておきます.以下の変数は値の取得時のみに使用してください.値の再代入は推奨されません.
- CanvasWidth
キャンバスの幅[px]です.キャンバスリサイズ時に自動的に更新されます.
- CanvasHeight
キャンバスの高さ[px]です.キャンバスリサイズ時に自動的に更新されます.
- CursorX,CursorY
キャンバス上のマウスカーソル座標です.マウスカーソル移動時に自動的に更新されます.
- Frame
現在のフレーム数です.キャンバス上部に表示する情報として使用しているので少し注意が必要です.
- pixels[]
キャンバスの情報を格納する配列データです.正確には「次にキャンバスに描画する色情報」を格納しています.
1次元配列(R, G, B, A, R, ……)
描画系関数
これらの関数は配列
pixels[]を操作するものであり,キャンバスへの描画は別途
ApplyImageArray()を実行する必要があります.
- DrawDot(x, y, r, g, b)
指定した座標のピクセルをRGBカラーで着色します.
x(X座標)
y(Y座標)
r(赤):0~255
g(緑):0~255
b(青):0~255
- DrawDotHSV(x, y, h, s, v)
指定した座標のピクセルをHSVカラーで着色します.
x(X座標)
y(Y座標)
h(色相):0~360
s(彩度):0~1
v(明度):0~1
- DrawRect(x, y, width, height, r, g, b)
指定した矩形領域をRGBカラーで塗りつぶします.
x, y(矩形左上の座標)
width(矩形領域の幅)
height(矩形領域の高さ)
r(赤):0~255
g(緑):0~255
b(青):0~255
- DrawRectHSV(x, y, width, height, h, s, v)
指定した矩形領域をHSVカラーで塗りつぶします.
x, y(矩形左上の座標)
width(矩形領域の幅)
height(矩形領域の高さ)
h(色相):0~360
s(彩度):0~1
v(明度):0~1
キャンバス情報取得
これらの関数は配列
pixels[]から色情報を取得するものです.
- GetR(x, y)
キャンバスから指定した座標のR値を返します.
x(X座標)
y(Y座標)
- GetG(x, y)
キャンバスから指定した座標のG値を返します.
x(X座標)
y(Y座標)
- GetB(x, y)
キャンバスから指定した座標のB値を返します.
x(X座標)
y(Y座標)
汎用関数
知ってると便利な関数です.
- HSVtoR(h, s, v)
HSVカラーをRGBカラーに変換してR値を返します.
h(色相):0~360
s(彩度):0~1
v(明度):0~1
- HSVtoG(h, s, v)
HSVカラーをRGBカラーに変換してG値を返します.
h(色相):0~360
s(彩度):0~1
v(明度):0~1
- HSVtoB(h, s, v)
HSVカラーをRGBカラーに変換してB値を返します.
h(色相):0~360
s(彩度):0~1
v(明度):0~1