package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; public class Strand extends Sprite { private var p1:Point; private var p2:Point; private var pC:Point; private var s:Number; private var a:Number; public function Strand() { super(); addEventListener(Event.ADDED_TO_STAGE, onStage); } public function moveAndDraw():void { graphics.clear(); graphics.lineStyle(s, 0x000000, a); graphics.moveTo(p1.x, p1.y); graphics.curveTo(pC.x, pC.y, p2.x, p2.y); s = fitS(s + wiggle(.35)); a = fitA(a + wiggle(.1)); drift(p1, 2); drift(p2, 3); drift(pC, 9); } private function onStage(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, onStage); p1 = new Point(rx(), ry()); pC = new Point(rx(), ry()); p2 = new Point(rx(), ry()); s = 3; a = .5; } private function rx():Number { return Math.random() * stage.stageWidth; } private function ry():Number { return Math.random() * stage.stageHeight; } private function fitX(n:Number):Number { return Math.min(stage.stageWidth, Math.max(0, n)); } private function fitY(n:Number):Number { return Math.min(stage.stageHeight, Math.max(0, n)); } private function fitS(n:Number):Number { return Math.min(5, Math.max(1, n)); } private function fitA(n:Number):Number { return Math.min(1, Math.max(.2, n)); } private function wiggle(amt:Number=1):Number { return (Math.random() * 2 - 1) * amt; } private function drift(p:Point, amt:Number=1):void { p.x = fitX(p.x + wiggle(amt)); p.y = fitY(p.y + wiggle(amt)); } } }