// http://wonderfl.net/code/70fa822e65c4c2d9e9df9bf421cd35d7170ce9c2 // こちらの模写です。しかも動きちょっとおかしいです package{ import flash.display.Sprite; import flash.geom.Point; import flash.events.MouseEvent; [SWF(backgroundColor=0xffffff, frameRate=60)] public class Splite extends Sprite{ private var _startPoint:Point; private var _endPoint:Point; private var _line:Sprite; private var _paper:Paper; public function Splite():void{ _line = new Sprite(); _paper = new Paper( [new Point(0,0), new Point(200,0), new Point(200,200), new Point(0,200)] ); _paper.x = _paper.y = 100; stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true); addChild(_paper); addChild(_line); } private function mouseDownHandler( event:MouseEvent ):void{ _startPoint = new Point( stage.mouseX, stage.mouseY); stage.removeEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler, false, 0, true); stage.addEventListener( MouseEvent.MOUSE_MOVE, mouseDragHandler, false, 0, true); } private function mouseUpHandler( event:MouseEvent):void{ _endPoint = new Point( stage.mouseX, stage.mouseY); _paper.cut(_startPoint, _endPoint); stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseDragHandler); stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler, false, 0, true); _line.graphics.clear(); } private function mouseDragHandler( event:MouseEvent):void{ _line.graphics.clear(); _line.graphics.lineStyle( 1, 0x000000, 1); _line.graphics.moveTo( _startPoint.x, _startPoint.y); _line.graphics.lineTo( stage.mouseX, stage.mouseY); _line.graphics.endFill(); } } } import flash.display.Sprite; import flash.geom.Point; import flash.events.MouseEvent; class Paper extends Sprite{ public function Paper( points:Array ):void{ addChild( new PaperFragment(points)); } public function cut(_startPoint:Point, _endPoint:Point):void{ trace(String(this.numChildren)); var num:int = this.numChildren; for(var i:uint = 0; i < num; i++){ this.getChildAt(i).dispatchEvent(new MyEvent(MyEvent.CUT, _startPoint, _endPoint)); } } } class PaperFragment extends Sprite{ private var _points:Array; public function PaperFragment( points:Array ):void{ trace("new PaperFragment"); _points = points; drawRectFromPoint(); addEventListener( MyEvent.CUT, cut, false, 0, true); } private function cut(event:MyEvent):void{ trace("cut PaperFragment"); var _startPoint:Point = globalToLocal(event.startPoint); var _endPoint:Point = globalToLocal(event.endPoint); var _newPointArray:Array = [new Array(), new Array()]; var _numCloss:int = 0; for( var i:int = 0; i < _points.length; i++){ var _target1:Point = _points[i]; var _target2:Point = _points[i+1] ? _points[i+1] : _points[0]; var _clossPt:Point = crossPoint( _startPoint, _endPoint, _target1, _target2); _newPointArray[0].push(_target1); if(_clossPt){ _newPointArray[0].push(_clossPt); _newPointArray[1].push(_clossPt); _newPointArray.reverse(); _numCloss++; } } if(_numCloss == 2){ this.removeEventListener( MyEvent.CUT, cut); var _newObj1:PaperFragment = new PaperFragment(_newPointArray[0]); var _newObj2:PaperFragment = new PaperFragment(_newPointArray[1]); _newObj1.x = _newObj2.x = this.x; _newObj1.y = _newObj2.y = this.y; parent.addChild(_newObj1); parent.addChild(_newObj2); trace(parent); parent.removeChild(this); } } /* * ------------------------------------------------------------ * 交点を割り出す * ------------------------------------------------------------ */ private function crossPoint( _pt1:Point , _pt2:Point , _pt3:Point , _pt4:Point ):Point { var _vector1:Point = _pt2.subtract( _pt1 ); var _vector2:Point = _pt4.subtract( _pt3 ); if ( cross( _vector1, _vector2 ) == 0.0) return null; var _s:Number = cross( _vector2 , _pt3.subtract( _pt1) ) / cross( _vector2 , _vector1 ); var _t:Number = cross( _vector1, _pt1.subtract( _pt3 ) ) / cross( _vector1, _vector2 ); if ( isCross( _s ) && isCross( _t ) ) { _vector1.x *= _s; _vector1.y *= _s; return _pt1.add( _vector1 ); } else return null; } private function cross( _vector1:Point , _vector2:Point ):Number { return ( _vector1.x * _vector2.y - _vector1.y * _vector2.x ); } public static function isCross( _n:Number ):Boolean { return ( ( 0 <= _n ) && ( _n <= 1) ); } private function drawRectFromPoint():void{ this.graphics.beginFill(Math.random() * 0xffff00); this.graphics.moveTo(_points[0].x, _points[0].y); for( var i:int = 1; i < _points.length; i++){ this.graphics.lineTo( _points[i].x, _points[i].y); } this.graphics.endFill(); } } import flash.events.Event; class MyEvent extends Event{ public var startPoint:Point; public var endPoint:Point; public static const CUT:String = "cut"; public function MyEvent(type:String, _startPoint:Point, _endPoint:Point ){ trace("new MyEvent"); super(type); this.startPoint = _startPoint; this.endPoint = _endPoint; } } flash on 2009-12-28