1 package net.systemeD.halcyon {
3 import flash.display.*;
4 import flash.geom.Matrix;
5 import flash.geom.Point;
6 import flash.geom.Rectangle;
7 import flash.text.AntiAliasType;
8 import flash.text.GridFitType;
9 import flash.text.TextField;
10 import flash.text.TextFormat;
11 import flash.events.*;
12 import net.systemeD.halcyon.styleparser.*;
13 import net.systemeD.halcyon.connection.*;
15 public class Elastic {
17 public var map:Map; // reference to parent map
18 public var sprites:Array=new Array(); // instances in display list
19 private var _start:Point;
20 private var _end:Point;
22 public function Elastic(map:Map, start:Point, end:Point) {
29 public function set start(start:Point):void {
34 public function set end(end:Point):void {
39 public function get start():Point {
43 public function get end():Point {
47 public function removeSprites():void {
48 // Remove all currently existing sprites
49 while (sprites.length>0) {
50 var d:DisplayObject=sprites.pop(); d.parent.removeChild(d);
54 public function redraw():void {
57 // Iterate through each sublayer, drawing any styles on that layer
61 // Create stroke object
62 var stroke:Shape = new Shape();
63 stroke.graphics.lineStyle(1, 0xff0000, 1, false, "normal", CapsStyle.ROUND, JointStyle.ROUND);
65 dashedLine(stroke.graphics, [2,2]);
67 var nodes:Sprite = new Sprite();
68 drawNodes(nodes.graphics);
73 // ------------------------------------------------------------------------------------------
74 // Drawing support functions
76 private function drawNodes(g:Graphics):void {
77 g.lineStyle(1, 0xff0000, 1, false, "normal", CapsStyle.ROUND, JointStyle.ROUND);
78 for (var i:uint = 0; i < 1; i++) {
79 var p:Point = i == 0 ? start : end;
80 var x:Number = map.lon2coord(p.x);
81 var y:Number = map.latp2coord(p.y);
90 // Draw dashed polyline
92 private function dashedLine(g:Graphics,dashes:Array):void {
93 var draw:Boolean=false, dashleft:Number=0, dc:Array=new Array();
94 var a:Number, xc:Number, yc:Number;
95 var curx:Number, cury:Number;
96 var dx:Number, dy:Number, segleft:Number=0;
101 g.moveTo(map.lon2coord(p0.x), map.latp2coord(p0.y));
102 while (i < 1 || segleft>0) {
103 if (dashleft<=0) { // should be ==0
104 if (dc.length==0) { dc=dashes.slice(0); }
108 if (segleft<=0) { // should be ==0
109 curx=map.lon2coord(p0.x);
110 dx=map.lon2coord(p1.x)-curx;
111 cury=map.latp2coord(p0.y);
112 dy=map.latp2coord(p1.y)-cury;
113 a=Math.atan2(dy,dx); xc=Math.cos(a); yc=Math.sin(a);
114 segleft=Math.sqrt(dx*dx+dy*dy);
118 if (segleft<=dashleft) {
119 // the path segment is shorter than the dash
121 moveLine(g,curx,cury,draw);
122 dashleft-=segleft; segleft=0;
124 // the path segment is longer than the dash
125 curx+=dashleft*xc; dx-=dashleft*xc;
126 cury+=dashleft*yc; dy-=dashleft*yc;
127 moveLine(g,curx,cury,draw);
128 segleft-=dashleft; dashleft=0;
133 private function moveLine(g:Graphics,x:Number,y:Number,draw:Boolean):void {
134 if (draw) { g.lineTo(x,y); }
135 else { g.moveTo(x,y); }
139 // Add object (stroke/fill/roadname) to layer sprite
141 private function addToLayer(s:DisplayObject,t:uint,sublayer:int=-1):void {
142 var l:DisplayObject=Map(map).getChildAt(5);
143 var o:DisplayObject=Sprite(l).getChildAt(t);
144 if (sublayer!=-1) { o=Sprite(o).getChildAt(sublayer); }
145 Sprite(o).addChild(s);
148 Sprite(s).mouseEnabled = false;
149 Sprite(s).mouseChildren = false;