]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/routing/ConnectionDirectionUtil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / routing / ConnectionDirectionUtil.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.g2d.routing;\r
13 \r
14 import java.awt.geom.Rectangle2D;\r
15 import java.util.Arrays;\r
16 \r
17 import org.simantics.g2d.routing.IConnection.Connector;\r
18 \r
19 public class ConnectionDirectionUtil {\r
20         \r
21         public static class Dir implements Comparable<Dir> {\r
22                 int id;\r
23                 double dist;\r
24                 \r
25                 public Dir(int id, double dist) {\r
26                         this.id = id;\r
27                         this.dist = dist;\r
28                 }\r
29 \r
30                 @Override\r
31                 public int compareTo(Dir o) {\r
32                         if(dist < o.dist)\r
33                                 return -1;\r
34                         if(o.dist < dist)\r
35                                 return 1;\r
36                         return 0;\r
37                 }       \r
38                 \r
39         }\r
40         \r
41         public static Terminal createTerminal(Rectangle2D shape, double x, double y) {\r
42                 Dir[] dirs = new Dir[] {\r
43                         new Dir(0, shape.getMaxX() - x),\r
44                         new Dir(1, shape.getMaxY() - y),\r
45                         new Dir(2, x - shape.getMinX()),\r
46                         new Dir(3, y - shape.getMinY()),\r
47                 };\r
48                 Arrays.sort(dirs);\r
49                 double[] dist = new double[4];\r
50                 int flags = 0;\r
51                 int i=0;\r
52                 do {\r
53                         flags |= 1 << dirs[i].id;\r
54                         dist[dirs[i].id] = Math.max(0.0, dirs[i].dist+1e-6);\r
55                         ++i;\r
56                 } while(i < 4 && (dirs[i].dist <= 0.0 || dirs[i].dist*0.9 < dirs[0].dist));\r
57                 return new Terminal(x, y, flags, dist, shape);\r
58         }\r
59         \r
60         public static int reverseDirections(int flags) {\r
61                 return ((flags & Constants.EAST_FLAG) == 0 ? 0 : Constants.WEST_FLAG)\r
62                          | ((flags & Constants.SOUTH_FLAG) == 0 ? 0 : Constants.NORTH_FLAG)\r
63                          | ((flags & Constants.WEST_FLAG) == 0 ? 0 : Constants.EAST_FLAG)\r
64                          | ((flags & Constants.NORTH_FLAG) == 0 ? 0 : Constants.SOUTH_FLAG);\r
65         }\r
66         \r
67         public static void determineAllowedDirections(Connector c) {\r
68             if(c.parentObstacle == null) {\r
69                 c.allowedDirections = 0xf;\r
70                 return;\r
71             }\r
72             Dir[] dirs = new Dir[] {\r
73             new Dir(0, c.parentObstacle.getMaxX() - c.x),\r
74             new Dir(1, c.parentObstacle.getMaxY() - c.y),\r
75             new Dir(2, c.x - c.parentObstacle.getMinX()),\r
76             new Dir(3, c.y - c.parentObstacle.getMinY()),\r
77         };\r
78         Arrays.sort(dirs);\r
79         double[] dist = new double[4];\r
80         c.allowedDirections = 0;\r
81         int i=0;\r
82         do {\r
83             c.allowedDirections |= 1 << dirs[i].id;\r
84             dist[dirs[i].id] = Math.max(0.0, dirs[i].dist+1e-6);\r
85             ++i;\r
86         } while(i < 4 &&\r
87                         ((dirs[i].id == ((dirs[0].id + 2)&3) && (dirs[i].dist <= 0.0 || dirs[i].dist*0.9 < dirs[0].dist)) ||\r
88                         (dirs[i].dist <= 0.0 || dirs[i].dist*0.95 < dirs[0].dist))\r
89                         );\r
90         }\r
91 }\r