// ActionScript 3 dashed/dotted polyline // draws a dotted line along the coordinates in this.path // (i.e. path[0].x,path[0].y -> path[1].x,path[1.y] etc.) // call with a Graphics object for the line, plus // an array of dash/space lengths - so (6,3,1,3) // will draw ------ - ------ - private function dashedLine(g:Graphics,dashes:Array):void { var draw:Boolean=false, dashleft:Number=0, dc:Array=new Array(); var a:Number, xc:Number, yc:Number; var curx:Number, cury:Number; var dx:Number, dy:Number, segleft:Number=0; var i:int=0; g.moveTo(path[0].x,path[0].y); while (i0) { if (dashleft<=0) { if (dc.length==0) { dc=dashes.slice(0); } dashleft=dc.shift(); draw=!draw; } if (segleft<=0) { curx=path[i].x; dx=path[i+1].x-curx; cury=path[i].y; dy=path[i+1].y-cury; a=Math.atan2(dy,dx); xc=Math.cos(a); yc=Math.sin(a); segleft=Math.sqrt(dx*dx+dy*dy); i++; } if (segleft<=dashleft) { // the path segment is shorter than the dash curx+=dx; cury+=dy; moveLine(g,curx,cury,draw); dashleft-=segleft; segleft=0; } else { // the path segment is longer than the dash curx+=dashleft*xc; dx-=dashleft*xc; cury+=dashleft*yc; dy-=dashleft*yc; moveLine(g,curx,cury,draw); segleft-=dashleft; dashleft=0; } } } private function moveLine(g:Graphics,x:Number,y:Number,draw:Boolean):void { if (draw) { g.lineTo(x,y); } else { g.moveTo(x,y); } }