« ページの合成 | トップページ | タッチパネルはよく解らん »

2012年5月11日 (金)

ページの合成 -2-

FlatTable のページ合成機能の実装が終了しました。

ページが複数の時は、台の右横に合成指定・表示ボタンが表示されます。ボタンは縦2列に並んで、左側は現行ページが合成するページを指定するボタン、右側は現行ページを合成しているページを表示するボタン(表示だけだからボタンではないですが)です。左側のボタンをクリックすると、そのボタンは緑色になり、それに対応しているページが合成表示されます。再度クリックすると合成は解除されます。右側のボタンで緑色になっているのは、それに対応しているページが現行ページを合成していることを表しています。現行ページのボタン [ CUR ] を中心にして、上はページ番号が増加する方向、下は減少する方向を示しています。

配置図 図に表示されている1~9番の球は、それぞれ1~9ページに配置されたものです。現行のページは5ページ目になっており、ボタンに示されているページを合成しています。3ページ目と8ページ目は合成していません。また、2ページ目は現行ページ(5ページ目)を合成しています。現行ページを2ページ目にすれば、2ページ目の配置に5ページ目を合成したものが表示されることになります。

この合成の状況は各ページの変数 peepAt および peepBy で管理しています。この変数の下位4ビットは前方(ページ番号が増加する方向)の合成を表すフラッグで、上位4ビットは後方(ページ番号が減少する方向)の合成を表すフラッグです。

新しいページを生成した時の peepAt および peepBy の処理ルーチンを示します。ここに curPage は現行ページです。

// 新ページ追加時のビット処理
function ppShiftIns(){
    shiftFlag(curPage, 15, true);    // (1)

    var i;
    var page;
    var mask;

    for (i = 1, page = curPage.prev, mask = 1;    // (2)
        (i <= 4)&&(page != curPage);
        mask |= (1 << i++), page = page.prev)    // (3)
    {
        shiftFlag(page, 15 - mask, true);    // (4)
    }
    for (i = 1, page = curPage.next;    // (5)
        (i <= 4)&&(page != curPage);
        i++, page = page.next)
    {
        shiftFlag(page, (15 << 4), true);
    }
}

function shiftFlag(page, mask, fAdd){
    var flagAt;
    var flagBy;
    if (fAdd){
        flagAt = (page.peepAt & mask) << 1;
        flagBy = (page.peepBy & mask) << 1;
    } else {
        flagAt = (page.peepAt & mask) >> 1;
        flagBy = (page.peepBy & mask) >> 1;
    }
    flagAt &= mask;
    flagBy &= mask;

    page.peepAt &= ~mask;
    page.peepAt |= flagAt;

    page.peepBy &= ~mask;
    page.peepBy |= flagBy;
}
新しいページは現行ページとその次のページの間に挿入されます。従って、現行のページから見て前方のページは1つずつ遠くにズレます。その処理は (1) で実行されています。15 は下位4ビットのマスクです。他のページについてもビット処理をします。それが (2) および (5) です。(2) は現行ページよりも若い番号のページに属している変数 peepAt および peepBy の処理です。それらのページが新ページ挿入で影響を受けるのは現行ページよりも番号の大きい方向なので、それより手前に関しては現状のビットは維持することになります。それが (3) の
    mask |= (1 << i++)
および (4) の
    15 - mask
で実現されています。ppShiftIns() では、この箇所がキモで、実はここで手こずっていたのでした。

--------
ここまでの動作およびコードは、本ブログのサイドバー「Link」の「SVG+JavaScript 版 FlatTable の試作品」で確認できます。

« ページの合成 | トップページ | タッチパネルはよく解らん »

ビリヤードの配置図ソフト」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/584699/54688041

この記事へのトラックバック一覧です: ページの合成 -2-:

« ページの合成 | トップページ | タッチパネルはよく解らん »