1 package net.systemeD.potlatch2.tools {
3 import net.systemeD.halcyon.connection.*;
6 // ** needs to be properly undoable
8 public class Parallelise {
9 private var originalWay:Way;
10 public var parallelWay:Way;
11 private var connection:Connection;
12 private var offsetx:Array=[];
13 private var offsety:Array=[];
14 private var df:Array=[];
15 private var nodes:Object={};
17 public function Parallelise(way:Way) {
18 var a:Number, b:Number, h:Number, i:uint;
19 connection = Connection.getConnection();
21 parallelWay = connection.createWay({}, [], MainUndoStack.getGlobalStack().addAction);
23 for (i=0; i<originalWay.length-1; i++) {
24 a=originalWay.getNode(i ).latp - originalWay.getNode(i+1).latp;
25 b=originalWay.getNode(i+1).lon - originalWay.getNode(i ).lon;
27 if (h!=0) { a=a/h; b=b/h; }
33 for (i=1; i<originalWay.length-1; i++) {
34 a=det(offsetx[i]-offsetx[i-1],
35 offsety[i]-offsety[i-1],
36 originalWay.getNode(i+1).lon - originalWay.getNode(i ).lon,
37 originalWay.getNode(i+1).latp - originalWay.getNode(i ).latp);
38 b=det(originalWay.getNode(i ).lon - originalWay.getNode(i-1).lon,
39 originalWay.getNode(i ).latp - originalWay.getNode(i-1).latp,
40 originalWay.getNode(i+1).lon - originalWay.getNode(i ).lon,
41 originalWay.getNode(i+1).latp - originalWay.getNode(i ).latp);
42 if (b!=0) { df[i]=a/b; } else { df[i]=0; }
47 public function draw(offset:Number):void {
48 var x:Number, y:Number;
49 var undo:CompositeUndoableAction = new CompositeUndoableAction("Draw parallel way");
50 parallelWay.suspend();
51 for (var i:int=0; i<originalWay.length; i++) {
53 x=originalWay.getNode(0).lon + offset * offsetx[0];
54 y=originalWay.getNode(0).latp+ offset * offsety[0];
55 } else if (i==originalWay.length-1) {
56 x=originalWay.getNode(i).lon + offset * offsetx[i-1];
57 y=originalWay.getNode(i).latp+ offset * offsety[i-1];
59 x=originalWay.getNode(i).lon + offset * (offsetx[i-1] + df[i] * (originalWay.getNode(i).lon - originalWay.getNode(i-1).lon ));
60 y=originalWay.getNode(i).latp+ offset * (offsety[i-1] + df[i] * (originalWay.getNode(i).latp- originalWay.getNode(i-1).latp));
63 nodes[i].setLonLatp(x,y,undo.push);
65 nodes[i] = connection.createNode({},Node.latp2lat(y),x,undo.push);
66 parallelWay.appendNode(nodes[i], undo.push);
70 MainUndoStack.getGlobalStack().addAction(undo);
73 private function det(a:Number,b:Number,c:Number,d:Number):Number { return a*d-b*c; }