jscam.jsのソースコード「ユーティリティ」

説明

 「crocro.jscam」は、クロノス・クラウンの柳井政和が開発しているJavaScirptのライブラリです。「crocro.jscam」を使うと、JavaScriptからWebカメラを扱うことができます。また、簡単な図形認識などを行えます。

 このページでは、この「crocro.jscam」のコアになる「jscam.js」(ver 1.1.0)のソースコードのうち、「ユーティリティ」に相当する部分を掲載します。

ソースコード

以下、ソースコードです。

//== ユーティリティ
crocro.jscam.util = function() {};


    /**
     *  @variable   crocro.jscam.util.swapXY(w, h, arg)
     *  @title  配列のXY交換
     *  @description
     *
     *      配列の縦横を入れ替えます。プログラムを見やすく書くために利用します。
     *
     *  @param  w       配列の横幅。
     *  @param  h       配列の高さ。
     *  @param  arg     二次元配列。
     *  @return 縦横を入れ替えた配列。
     */
//== 配列のXY交換
crocro.jscam.util.swapXY = function(w, h, arg) {
    var x, y;
    var xArr = new Array(w);
    for (x = 0; x < w; x ++) {
        var yArr = new Array(y);
        for (y = 0; y < h; y ++) yArr[y] = arg[y][x];
        xArr[x] = yArr;
    }
    return xArr;
};


    /**
     *  @variable   crocro.jscam.util.makeMarker(id, arr, pxSz, isEdit, evtOnClick)
     *  @title  マーカーの作成
     *  @description
     *
     *      配列を指定して、「table」タグでできたマーカーを作成します。
     *      isEditにtrueを指定することで、クリックで編集可能になります。
     *      また、evtOnClickを指定することで、クリック時のコールバック処理を指定できます。
     *
     *  @param  id      マーカーを作成するDOM要素のID。
     *  @param  arr     マーカーを表現する01の二次元配列。
     *  @param  pxSz    1セルあたりのドット数。
     *  @param  isEdit  trueなら編集可能、falseなら編集不能。
     *  @param  evtOnClick  isEditがtrueの場合に動作。クリック時のコールバック処理をfunctionオブジェクトで指定する。
     *                  このfunctionオブジェクトは「function(x, y, prm)」としてXY座標と変更後の値を受け取れる。
     */
//== マーカーの作成
crocro.jscam.util.makeMarker = function(id, arr, pxSz, isEdit, evtOnClick) {
    var sz = arr.length;
    var tbl = document.createElement("table");
    tbl.id = id + 'Tbl';
    tbl.setAttribute("border", 0);
    tbl.setAttribute("cellspacing", 0);
    tbl.setAttribute("cellpadding", 0);

    for (var y = 0; y < sz; y ++) {
        var tr = document.createElement("tr");
        for (var x = 0; x < sz; x ++) {
            var col = arr[x][y] == 1 ? 'black' : 'white';
            var celId = id + 'Tbl_' + x + '_' + y;

            var td = document.createElement("td");
            tr.appendChild(td);
            var div = document.createElement("div");
            td.appendChild(div);

            div.style.width = pxSz + 'px';
            div.style.height = pxSz + 'px';
            div.style.background = col;
            div.style.overflow = 'hidden';
            div.style.color = col;
            div.id = celId;
            if (isEdit) {
                div.addEventListener("click", (function(x, y){
                    return function() {
                        var prm = 1 - this.innerHTML * 1;
                        this.innerHTML = prm;
                        this.style.background = this.style.color = prm ? 'black' : 'white';
                        if (typeof evtOnClick == 'function') evtOnClick(x, y, prm);
                    };
                })(x, y));
            }
            div.innerHTML = arr[x][y];
        }
        tbl.appendChild(tr);
    }
    document.getElementById(id).appendChild(tbl);
};


    /**
     *  @variable   crocro.jscam.util.makeDots(id, arr, pxSz, isEdit, evtOnClick)
     *  @title  ドット・パターンの作成
     *  @description
     *
     *      配列を指定して、「table」タグでできたドット・パターンを作成します。
     *      isEditにtrueを指定することで、クリックで編集可能になります。
     *      また、evtOnClickを指定することで、クリック時のコールバック処理を指定できます。
     *
     *  @param  id      ドット・パターンを作成するDOM要素のID。
     *  @param  arr     ドット・パターンを表現する01の二次元配列。
     *  @param  pxSz    1セルあたりのドット数。
     *  @param  isEdit  trueなら編集可能、falseなら編集不能。
     *  @param  evtOnClick  isEditがtrueの場合に動作。クリック時のコールバック処理をfunctionオブジェクトで指定する。
     *                  このfunctionオブジェクトは「function(x, y, prm)」としてXY座標と変更後の値を受け取れる。
     */
//== ドット・パターンの作成
crocro.jscam.util.makeDots = function(id, arr, cellSz, isEdit, evtOnClick) {
    var sz = arr.length;
    var tbl = document.createElement("table");
    tbl.id = id + 'Tbl';
    tbl.setAttribute("border", 0);
    tbl.setAttribute("cellspacing", 0);
    tbl.setAttribute("cellpadding", 0);

    var cellSzBig = parseInt(cellSz * 0.8);
    var cellSzSml = parseInt(cellSz * 0.35);

    for (var y = 0; y < sz; y ++) {
        var tr = document.createElement("tr");
        for (var x = 0; x < sz; x ++) {
            var thisCellSz = arr[x][y] == 1 ? cellSzBig : cellSzSml;
            var celId = id + 'Tbl_' + x + '_' + y;

            var td = document.createElement("td");
            td.setAttribute("align", "center");
            td.setAttribute("valign", "middle");
            td.style.background = "white";
            td.style.width = cellSz + 'px';
            td.style.height = cellSz + 'px';
            tr.appendChild(td);
            var div = document.createElement("div");
            td.appendChild(div);

            div.style.width = thisCellSz + 'px';
            div.style.height = thisCellSz + 'px';
            div.style.background = "black";
            div.style.overflow = 'hidden';
            div.style.color = "black";
            div.id = celId;
            if (isEdit) {
                div.addEventListener("click", (function(x, y){
                    return function() {
                        var prm = 1 - this.innerHTML * 1;
                        this.innerHTML = prm;

                        var thisCellSz = prm == 1 ? cellSzBig : cellSzSml;
                        this.style.width = thisCellSz + 'px';
                        this.style.height = thisCellSz + 'px';

                        if (typeof evtOnClick == 'function') evtOnClick(x, y, prm);
                    };
                })(x, y));
            }
            div.innerHTML = arr[x][y];
        }
        tbl.appendChild(tr);
    }
    document.getElementById(id).appendChild(tbl);
};
Cronus Crown(クロノス・クラウン)のトップページに戻る
(c)2002-2024 Cronus Crown (c)1997-2024 Masakazu Yanai
ご意見・お問い合わせはサイト情報 弊社への連絡までお願いします
個人情報の取り扱い、利用者情報の外部送信について