In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

NyIDMarkerMakerのFlash版

http://sixwish.jp/Flartoolkit/Marker/idMarker/
これのFLASH版が必要になってつくったので、公開してみる。

http://flash.tarotaro.org/ar/FLARIdMarkerSample.html ここでIDが表示されるはずです。

http://sourceforge.jp/projects/nyartoolkit/svn/view/NyARToolkit/trunk/Data/NyARIdMarkerFormat.odt?root=nyartoolkit&view=log
の仕様書に基づき作成しました。

ありがとうございます!!
Get Adobe Flash player
by motikawa_rgm 08 Jul 2010
    Embed
/**
 * Copyright motikawa_rgm ( http://wonderfl.net/user/motikawa_rgm )
 * GNU General Public License, v3 ( http://www.gnu.org/licenses/quick-guide-gplv3.html )
 * Downloaded from: http://wonderfl.net/c/wpyS
 */

package 
{
    import com.adobe.images.PNGEncoder;
    import com.bit101.components.NumericStepper;
    import com.bit101.components.PushButton;
    import com.bit101.components.RadioButton;
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.FileReference;
    import flash.utils.ByteArray;
    /*
     * http://sixwish.jp/Flartoolkit/Marker/idMarker/
     * これのFLASH版が必要になってつくったので、公開してみる。
     * 
     * http://flash.tarotaro.org/ar/FLARIdMarkerSample.html ここでIDが表示されるはずです。
     * 
     * http://sourceforge.jp/projects/nyartoolkit/svn/view/NyARToolkit/trunk/Data/NyARIdMarkerFormat.odt?root=nyartoolkit&view=log
     * の仕様書に基づき作成しました。
     * 
     * 
     * ありがとうございます!!
     */
    [SWF( width=465, height=465, frameRate=30, backgroundColor=0xffffff )]
    public class Test extends Sprite
    {
        private var _fl:FileReference;
        private var _marker:Bitmap;
        private var _ns:NumericStepper;
        private var _currentLabel:int = 0;
        public function Test() 
        {
            init();
        }
        private function init():void
        {
            var pb:PushButton = new PushButton(this, 350, 405, "save", onButtonClick),
                rb1:RadioButton = new RadioButton(this, 100, 80, "Model2(5 * 5)", true, onChange),
                rb2:RadioButton = new RadioButton(this, 220, 80, "Model3(7 * 7)", false, onChange);
            
            _ns = new NumericStepper(this, 100, 410, onChange);
            _ns.minimum = 0;
            _ns.maximum = NyIDMarkerMaker.MAX_VALUE_MODEL2;
            _ns.width = 200;
            _ns.value = 0;
            pb.width = 50;
            _marker = addChild(new Bitmap()) as Bitmap;
            _marker.x = _marker.y = 100;
            onChange();
        }
        private function onButtonClick(event:MouseEvent):void
        {
            if (!_marker.bitmapData) return;
            
            var byte:ByteArray = PNGEncoder.encode(_marker.bitmapData);
            _fl = new FileReference();
            _fl.save(byte,"id_marker.png");
        }
        private function onChange(event:Event = null):void
        {
            if (event && event.currentTarget is RadioButton)
            {
                if ((event.currentTarget as RadioButton).label == "Model2(5 * 5)") _currentLabel = 0;
                else _currentLabel = 1;
                _ns.maximum = (_currentLabel == 0) ? NyIDMarkerMaker.MAX_VALUE_MODEL2 : NyIDMarkerMaker.MAX_VALUE_MODEL3;
            }
            draw();
        }
        private function draw():void
        {
            if(_marker.bitmapData) _marker.bitmapData.dispose();
            if (_currentLabel == 0) _marker.bitmapData = NyIDMarkerMaker.makeNyIDMarkerModel2(_ns.value);
            else _marker.bitmapData = NyIDMarkerMaker.makeNyIDMarkerModel3(_ns.value);
        }
        
    }
}
import flash.display.BitmapData;
import flash.geom.Rectangle;

class NyIDMarkerMaker 
{
    
    public static const MAX_VALUE_MODEL3:int = 33554431;
    public static const MAX_VALUE_MODEL2:int = 511;
    public static const SIZE:int = 300;
    private static const ZEROS:String = "100000000";
    private static const DEFAULT_PATTERN_MODEL3:Array = [7, 21, 35, 43, 45, 47];
    private static const DEFAULT_PATTERN_MODEL2:Array = [5, 15, 21, 23];
    private static const CHECK_DOT_PATTERN_MODEL3:Array = [13, 20, 27, 34, 41];
    private static const CHECK_DOT_PATTERN_MODEL2:Array = [9, 14, 19];
    private static const DATA_DOT_MODEL3_PACKET4:Array = [15, 22, 29, 36, 37, 38, 39, 40];
    private static const DATA_DOT_MODEL3_PACKET3:Array = [33, 26, 19, 12, 11, 10,  9,  8];
    private static const DATA_DOT_MODEL3_PACKET2:Array = [23, 30, 31, 32, 25, 18, 17, 16];
    private static const DATA_DOT_MODEL3_PACKET1:Array = [24];
    private static const DATA_DOT_MODEL2_PACKET2:Array = [11, 16, 17, 18, 13, 8, 7, 6];
    private static const DATA_DOT_MODEL2_PACKET1:Array = [12];
                                                   
    private static var _rect:Rectangle = new Rectangle();
    /**
     * Model3のマーカーを作成
     * @param    num NyID
     * @return 作成したBitmapData
     */
    public static function makeNyIDMarkerModel3(num:int):BitmapData
    {
        var offset:int = SIZE * .15,
            dotWidth:int = SIZE * .7 / 7,
            bmd:BitmapData = makeTemplateModel3(SIZE, offset, dotWidth);
            
        num = (num > MAX_VALUE_MODEL3) ? 0 : (num < 0) ? 0 :num;
        setDataDotModel3(bmd, num, offset, dotWidth);
        return bmd;
    }
    /**
     * Model2のマーカーを作成
     * @param    num NyID
     * @return 作成したBitmapData
     */
    public static function makeNyIDMarkerModel2(num:int):BitmapData
    {
        var offset:int = SIZE * .15,
            dotWidth:int = SIZE * .7 / 5,
            bmd:BitmapData = makeTemplateModel2(SIZE, offset, dotWidth);
            
        num = (num > MAX_VALUE_MODEL2) ? 0 : (num < 0) ? 0 :num;
        setDataDotModel2(bmd, num, offset, dotWidth);
        return bmd;
    }
    /**
     * Model2のテンプレートの作成
     * @param    size 画像サイズ
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     * @return  作成したBitmapData
     */
    private static function makeTemplateModel2(size:int, offset:int, dotWidth:int):BitmapData
    {
        var bmd:BitmapData = new BitmapData(size, size, false, 0x000000),
            i:int;
        bmd.fillRect(new Rectangle(offset, offset, size * .7, size * .7), 0xffffff);
        for each(i in DEFAULT_PATTERN_MODEL2) drawDot(bmd, i, offset, dotWidth, 5);
        return bmd;
    }
    /**
     * 
     * Model2のテンプレートの作成
     * @param    size 画像サイズ
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     * @return  作成したBitmapData
     */
    private static function makeTemplateModel3(size:int,offset:int,dotWidth:int):BitmapData
    {
        var bmd:BitmapData = new BitmapData(size, size, false, 0x000000),
            i:int;
            
        bmd.fillRect(new Rectangle(offset, offset, size * .7, size * .7), 0xffffff);
        for each(i in DEFAULT_PATTERN_MODEL3) drawDot(bmd, i, offset, dotWidth);
        
        return bmd;
    }
    /**
     * Model3試用のデータドット および チェックドットを生成
     * @param    bitmapData ベースになるBitmapData
     * @param    num NyID
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     */
    private static function setDataDotModel3(bitmapData:BitmapData, num:int, offset:int, dotWidth:int):void
    {
        var seg1:uint,
            seg2:uint,
            seg3:uint,
            seg4:uint,
            seg1_arr:Array,
            seg2_arr:Array,
            seg3_arr:Array,
            seg4_arr:Array,
            len:int = 8,
            i:int = 0;
            
        seg1 |= num >> 24 & 0xff;
        seg2 |= num >> 16 & 0xff;
        seg3 |= num >> 8 & 0xff;
        seg4 |= num & 0xff;
        
        setCheckDotModel3(bitmapData , seg1 + seg2 + seg3 + seg4, offset, dotWidth);
        
        seg4_arr = (parseInt(ZEROS, 2) | seg4).toString(2).slice(1,9).split("");
        seg3_arr = (parseInt(ZEROS, 2) | seg3).toString(2).slice(1,9).split("");
        seg2_arr = (parseInt(ZEROS, 2) | seg2).toString(2).slice(1,9).split("");
        seg1_arr = seg1.toString(2).split("");
        
        for (i = 0; i < len; i++) if (seg4_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL3_PACKET4[i], offset, dotWidth);
        for (i = 0; i < len; i++) if (seg3_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL3_PACKET3[i], offset, dotWidth);
        for (i = 0; i < len; i++) if (seg2_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL3_PACKET2[i], offset, dotWidth);
        for (i = 0, len = 1; i < len; i++) if (seg1_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL3_PACKET1[i], offset, dotWidth) ;
            
        return;
    }
    /**
     * Model2仕様の および チェックドットを生成
     * @param    bitmapData ベースになるBitmapData
     * @param    num NyID
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     */
    private static function setDataDotModel2(bitmapData:BitmapData, num:int, offset:int, dotWidth:int):void
    {
        var seg1:uint,
            seg2:uint,
            seg1_arr:Array,
            seg2_arr:Array,
            len:int = 8,
            i:int = 0;
                        
        seg1 |= num >> 8 & 0xff;
        seg2 |= num & 0xff;
        setCheckDotModel2(bitmapData , seg1 + seg2, offset, dotWidth);
        seg2_arr = (parseInt(ZEROS, 2) | seg2).toString(2).slice(1, 9).split("");
        seg1_arr = seg1.toString(2).split("");
        
        for (i = 0; i < len; i++) if (seg2_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL2_PACKET2[i], offset, dotWidth, 5);
        for (i = 0 , len = 1; i < len; i++) if (seg1_arr[i] == "1") drawDot(bitmapData, DATA_DOT_MODEL2_PACKET1[i], offset, dotWidth, 5);
    }
    /**
     * Model2仕様のチェックドットを生成
     * @param    bitmapData ベースになるBitmapData
     * @param    num NyID
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     */
    private static function setCheckDotModel2(bitmapData:BitmapData, num:int, offset:int,dotWidth:int):void
    {
        var value:int = num % 7,
            check_data:Array,
            i:int = 0,
            len:int = CHECK_DOT_PATTERN_MODEL3.length;
            
        value = (value >= 5) ? value + 1 : value;
        check_data = value.toString(2).split("").reverse();
        
        for (i = 0; i < len; i++)
            if (check_data[i] == "1") drawDot(bitmapData, CHECK_DOT_PATTERN_MODEL2[i], offset, dotWidth, 5);
            
        return ;
    }
    /**
     * Model2仕様のチェックドットを生成
     * @param    bitmapData ベースになるBitmapData
     * @param    num NyID
     * @param    offset 黒淵のサイズ
     * @param    dotWidth ドット幅
     */
    private static function setCheckDotModel3(bitmapData:BitmapData, num:int, offset:int,dotWidth:int):void
    {
        var value:int = num % 31,
            check_data:Array,
            i:int = 0,
            len:int = CHECK_DOT_PATTERN_MODEL3.length;
            
        value = (value >= 21) ? value + 1 : value;
        check_data = value.toString(2).split("").reverse();
        
        for (i = 0; i < len; i++)
            if (check_data[i] == "1") drawDot(bitmapData, CHECK_DOT_PATTERN_MODEL3[i], offset, dotWidth);
            
        return ;
    }
    /**
     * ドットの描画
     * @param    bitmapData
     * @param    pos
     * @param    offset
     * @param    dotWidth
     * @param    r
     */
    private static function drawDot(bitmapData:BitmapData, pos:int, offset:int, dotWidth:int,r:int = 7):void
    {
        _rect.width = _rect.height = dotWidth;
        _rect.x = (pos % r) * dotWidth + offset;
        _rect.y = Math.floor( pos / r) * dotWidth + offset;
        bitmapData.fillRect(_rect, 0x000000);
    }
}