package { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.events.Event; import fl.controls.Button; /** * @author nicoptere * http://en.nicoptere.net/ */ public class Delone extends MovieClip { private var tab:Array; public function Delone() { tab = []; var resetBtn:Button = new Button(); resetBtn.label = 'reset'; resetBtn.addEventListener( MouseEvent.CLICK, reset ); addChild( resetBtn ); stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler ); } private function reset( e:Event ):void { tab = []; render(); } private function mouseDownHandler ( e:MouseEvent ):void { if(e.target is Button )return; var deletion:Boolean = false; var dx:Number; var dy:Number; var dist:Number; //if we click within a 5 pixels radius of an existing point, delete the point for ( var i:int = 0; i < tab.length; i++ ) { var p:Point = tab[ i ] as Point; dx = p.x - mouseX; dy = p.y - mouseY; dist = Math.sqrt( dx*dx + dy*dy ); if( dist < 5 ) { tab.splice( i, 1); deletion = true; } } if( !deletion )tab.push( new Point( mouseX, mouseY ) ); render(); } private function render():void { graphics.clear(); var delaunay:Array = Delaunay.Triangulate( tab ); var t:Triangle; var i:int; var L:int = delaunay.length; for ( i = 0; i < L; i++ ) { t = ( delaunay[ i ] as Triangle ); graphics.lineStyle( 2, 0x006699, .5); graphics.moveTo(t.p1.x, t.p1.y); graphics.lineTo(t.p2.x, t.p2.y); graphics.lineTo(t.p3.x, t.p3.y); graphics.lineTo(t.p1.x, t.p1.y); graphics.lineStyle( 2, 0xCC0000, .5); graphics.drawCircle(t.p1.x, t.p1.y, 2); graphics.drawCircle(t.p2.x, t.p2.y, 2); graphics.drawCircle(t.p3.x, t.p3.y, 2); } } } }