package { import com.nitoyon.potras.*; import flash.display.*; import flash.geom.*; import flash.events.*; [SWF(width="320",height="320")] public class LonTest extends Sprite { [Embed(source='data1.gif')] private var Data1:Class; private static const SCALE:int = 8; public function LonTest() { var bmp:Bitmap = new Data1(); bmp.scaleX = bmp.scaleY = SCALE; var bmd:BitmapData = bmp.bitmapData; addChild(bmp); var i:int = 0; var j:int = 0; var pathList:Array = PathList.create(bmp.bitmapData); var lons:Array = []; for(i = 0; i < pathList.length; i++) { lons[i] = ProcessPath.calcLon(pathList[i].priv as Array); } drawPath(bmd, pathList); var bmdOver:BitmapData = new BitmapData(bmd.width, bmd.height); var bmpOver:Bitmap = new Bitmap(bmdOver); bmpOver.scaleX = bmpOver.scaleY = SCALE; addChild(bmpOver); i = 0; var mouseOver:Boolean = false; addEventListener("enterFrame", function(event:Event):void { if(mouseOver) return; drawLon(bmdOver, pathList, lons, i, j); j++; if(j >= lons[i].length) { j = 0; i = (i + 1) % lons.length; } }); var mouseHandler:Function = function(event:MouseEvent):void { var pt:Point = new Point(int(event.localX / SCALE), int(event.localY / SCALE)); var ij:Array = getIJfromPoint(pathList, pt); if(ij) { mouseOver = true; drawLon(bmdOver, pathList, lons, ij[0], ij[1]); } else { mouseOver = false; } }; if(stage) { stage.addEventListener("mouseMove", mouseHandler); } else { addEventListener("addedToStage", function(event:*):void { stage.addEventListener("mouseMove", mouseHandler); }); } } private static function drawPath(bmd:BitmapData, pathList:Array):void { bmd.fillRect(new Rectangle(0, 0, bmd.width, bmd.height), 0xffffffff); for(var i:int = 0; i < pathList.length; i++) { for(var j:int = 0; j < pathList[i].priv.length; j++) { var pt:Point = pathList[i].priv[j] as Point; if(pt) { bmd.setPixel(pt.x, pt.y, 0x999999); } } } } private function drawLon(bmd:BitmapData, pathList:Array, lons:Array, i:int, j:int):void { var pt:Point = pathList[i].priv[j] as Point; if(pt) { bmd.lock(); bmd.fillRect(new Rectangle(0, 0, bmd.width, bmd.height), 0x00ffffff); bmd.setPixel32(pt.x, pt.y, 0xff000000); var k:int = j; while(true) { k = (k + 1) % lons[i].length; if(k == lons[i][j]) { break; } pt = pathList[i].priv[k] as Point; bmd.setPixel32(pt.x, pt.y, 0xffff0000); } bmd.unlock(); } } private function getIJfromPoint(pathList:Array, point:Point):Array { for(var i:int = 0; i < pathList.length; i++) { for(var j:int = 0; j < pathList[i].priv.length; j++) { if(point.equals(pathList[i].priv[j] as Point)) { return [i, j] } } } return null; } } }