]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.g2d/src/org/simantics/g2d/routing/algorithm1/RoutePencil.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / routing / algorithm1 / RoutePencil.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.algorithm1;\r
13 \r
14 import java.awt.geom.Path2D;\r
15 \r
16 import org.simantics.g2d.routing.Constants;\r
17 \r
18 public class RoutePencil extends Rectangle {\r
19 \r
20         public final Direction direction;\r
21         public final RoutePencil parent;\r
22         public double penalty;\r
23         public double distanceConstant;\r
24         public double distanceX;\r
25         public double distanceY;\r
26 \r
27         public RoutePencil(double x0, double y0, double x1, double y1, \r
28                 double penalty, Direction direction, RoutePencil parent) {\r
29                 super(x0, y0, x1, y1);\r
30                 this.penalty = penalty;\r
31                 this.direction = direction;\r
32                 this.parent = parent;\r
33                 if(parent == null) {\r
34                         distanceConstant = 0.0;\r
35                         distanceX = 0.0;\r
36                         distanceY = 0.0;\r
37                 }\r
38                 else {\r
39                         switch(direction.getId()) {\r
40                         case Constants.EAST: {\r
41                                 distanceX = 1.0;\r
42                                 distanceY = parent.distanceY;\r
43                                 double x = Math.min(parent.x1, x0);\r
44                                 distanceConstant = parent.distanceConstant + \r
45                                         x * (parent.distanceX - distanceX);\r
46                         } break;\r
47                         case Constants.SOUTH: {\r
48                                 distanceX = parent.distanceX;\r
49                                 distanceY = 1.0;                                \r
50                                 double y = Math.min(parent.y1, y0);\r
51                                 distanceConstant = parent.distanceConstant + \r
52                                         y * (parent.distanceY - distanceY);\r
53                         } break;\r
54                         case Constants.WEST: {\r
55                                 distanceX = -1.0;\r
56                                 distanceY = parent.distanceY;\r
57                                 double x = Math.max(parent.x0, x1);\r
58                                 distanceConstant = parent.distanceConstant + \r
59                                         x * (parent.distanceX - distanceX);\r
60                         } break;\r
61                         case Constants.NORTH: {\r
62                                 distanceX = parent.distanceX;\r
63                                 distanceY = -1.0;                               \r
64                                 double y = Math.max(parent.y0, y1);\r
65                                 distanceConstant = parent.distanceConstant + \r
66                                         y * (parent.distanceY - distanceY);\r
67                         } break;\r
68                         }\r
69                 }\r
70         }\r
71         \r
72         double distance(double x, double y) {\r
73                 double result = distanceConstant;\r
74                 if(x < x0)\r
75                         result += distanceX * x0 + (x0 - x);\r
76                 else if(x > x1)\r
77                         result += distanceX * x1 + (x - x1);\r
78                 else\r
79                         result += distanceX * x;\r
80                 if(y < y0)\r
81                         result += distanceY * y0 + (y0 - y);\r
82                 else if(x > x1)\r
83                         result += distanceY * y1 + (y - y1);\r
84                 else\r
85                         result += distanceY * y;\r
86                 return result;\r
87         }\r
88         \r
89         double distance() {\r
90                 return distanceConstant + distanceX * x0 + distanceY * y0;\r
91         }\r
92         \r
93         void createPath(Path2D path, double x, double y) {\r
94                 if(parent == null) {\r
95                         /*switch(direction.getId()) {\r
96                         case Constants.EAST:\r
97                                 path.moveTo(x0, y);\r
98                                 break;\r
99                         case Constants.SOUTH:\r
100                                 path.moveTo(x, y0);\r
101                                 break;\r
102                         case Constants.WEST:\r
103                                 path.moveTo(x1, y);\r
104                                 break;\r
105                         case Constants.NORTH:\r
106                                 path.moveTo(x, y1);\r
107                                 break;\r
108                         }               \r
109                         */\r
110                         path.moveTo(makeFinite(x), makeFinite(y));\r
111                 }\r
112                 else {\r
113                         if(parent.contains(x, y))\r
114                                 parent.createPath(path, x, y);\r
115                         else {\r
116                                 switch(direction.getId()) {\r
117                                 case Constants.EAST:\r
118                                         if(parent.distanceX < 1.0)\r
119                                                 parent.createPath(path, parent.x1, y);\r
120                                         else \r
121                                                 parent.createPath(path, (parent.x0+parent.x1)*0.5, y);\r
122                                         break;\r
123                                 case Constants.SOUTH:\r
124                                         if(parent.distanceY < 1.0)\r
125                                                 parent.createPath(path, x, parent.y1);                                          \r
126                                         else \r
127                                                 parent.createPath(path, x, (parent.y0+parent.y1)*0.5);\r
128                                         break;\r
129                                 case Constants.WEST:\r
130                                         if(parent.distanceX > -1.0)\r
131                                                 parent.createPath(path, parent.x0, y);\r
132                                         else \r
133                                                 parent.createPath(path, (parent.x0+parent.x1)*0.5, y);\r
134                                         break;\r
135                                 case Constants.NORTH:\r
136                                         if(parent.distanceY > -1.0)\r
137                                                 parent.createPath(path, x, parent.y0);\r
138                                         else \r
139                                                 parent.createPath(path, x, (parent.y0+parent.y1)*0.5);\r
140                                         break;\r
141                                 }                       \r
142                                 path.lineTo(makeFinite(x), makeFinite(y));\r
143                         }\r
144                 }               \r
145         }\r
146         \r
147         static double makeFinite(double x) {\r
148                 if(x == Double.POSITIVE_INFINITY)\r
149                         return 10000.0;\r
150                 if(x == Double.NEGATIVE_INFINITY)\r
151                         return -10000.0;\r
152                 return x;\r
153         }\r
154         \r
155         public Path2D createPath(double x, double y) {\r
156                 Path2D path = new Path2D.Double();\r
157                 createPath(path, x, y);\r
158                 return path;\r
159         }\r
160         \r
161         @Override\r
162         public String toString() {\r
163                 if(parent == null)\r
164                         return Integer.toString(direction.getId());\r
165                 else\r
166                         return parent.toString() + " " + Integer.toString(direction.getId());\r
167         }\r
168 }\r