]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/routing/algorithm1/RoutePencil.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/routing/algorithm1/RoutePencil.java
new file mode 100644 (file)
index 0000000..1ffb505
--- /dev/null
@@ -0,0 +1,168 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.g2d.routing.algorithm1;\r
+\r
+import java.awt.geom.Path2D;\r
+\r
+import org.simantics.g2d.routing.Constants;\r
+\r
+public class RoutePencil extends Rectangle {\r
+\r
+       public final Direction direction;\r
+       public final RoutePencil parent;\r
+       public double penalty;\r
+       public double distanceConstant;\r
+       public double distanceX;\r
+       public double distanceY;\r
+\r
+       public RoutePencil(double x0, double y0, double x1, double y1, \r
+               double penalty, Direction direction, RoutePencil parent) {\r
+               super(x0, y0, x1, y1);\r
+               this.penalty = penalty;\r
+               this.direction = direction;\r
+               this.parent = parent;\r
+               if(parent == null) {\r
+                       distanceConstant = 0.0;\r
+                       distanceX = 0.0;\r
+                       distanceY = 0.0;\r
+               }\r
+               else {\r
+                       switch(direction.getId()) {\r
+                       case Constants.EAST: {\r
+                               distanceX = 1.0;\r
+                               distanceY = parent.distanceY;\r
+                               double x = Math.min(parent.x1, x0);\r
+                               distanceConstant = parent.distanceConstant + \r
+                                       x * (parent.distanceX - distanceX);\r
+                       } break;\r
+                       case Constants.SOUTH: {\r
+                               distanceX = parent.distanceX;\r
+                               distanceY = 1.0;                                \r
+                               double y = Math.min(parent.y1, y0);\r
+                               distanceConstant = parent.distanceConstant + \r
+                                       y * (parent.distanceY - distanceY);\r
+                       } break;\r
+                       case Constants.WEST: {\r
+                               distanceX = -1.0;\r
+                               distanceY = parent.distanceY;\r
+                               double x = Math.max(parent.x0, x1);\r
+                               distanceConstant = parent.distanceConstant + \r
+                                       x * (parent.distanceX - distanceX);\r
+                       } break;\r
+                       case Constants.NORTH: {\r
+                               distanceX = parent.distanceX;\r
+                               distanceY = -1.0;                               \r
+                               double y = Math.max(parent.y0, y1);\r
+                               distanceConstant = parent.distanceConstant + \r
+                                       y * (parent.distanceY - distanceY);\r
+                       } break;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       double distance(double x, double y) {\r
+               double result = distanceConstant;\r
+               if(x < x0)\r
+                       result += distanceX * x0 + (x0 - x);\r
+               else if(x > x1)\r
+                       result += distanceX * x1 + (x - x1);\r
+               else\r
+                       result += distanceX * x;\r
+               if(y < y0)\r
+                       result += distanceY * y0 + (y0 - y);\r
+               else if(x > x1)\r
+                       result += distanceY * y1 + (y - y1);\r
+               else\r
+                       result += distanceY * y;\r
+               return result;\r
+       }\r
+       \r
+       double distance() {\r
+               return distanceConstant + distanceX * x0 + distanceY * y0;\r
+       }\r
+       \r
+       void createPath(Path2D path, double x, double y) {\r
+               if(parent == null) {\r
+                       /*switch(direction.getId()) {\r
+                       case Constants.EAST:\r
+                               path.moveTo(x0, y);\r
+                               break;\r
+                       case Constants.SOUTH:\r
+                               path.moveTo(x, y0);\r
+                               break;\r
+                       case Constants.WEST:\r
+                               path.moveTo(x1, y);\r
+                               break;\r
+                       case Constants.NORTH:\r
+                               path.moveTo(x, y1);\r
+                               break;\r
+                       }               \r
+                       */\r
+                       path.moveTo(makeFinite(x), makeFinite(y));\r
+               }\r
+               else {\r
+                       if(parent.contains(x, y))\r
+                               parent.createPath(path, x, y);\r
+                       else {\r
+                               switch(direction.getId()) {\r
+                               case Constants.EAST:\r
+                                       if(parent.distanceX < 1.0)\r
+                                               parent.createPath(path, parent.x1, y);\r
+                                       else \r
+                                               parent.createPath(path, (parent.x0+parent.x1)*0.5, y);\r
+                                       break;\r
+                               case Constants.SOUTH:\r
+                                       if(parent.distanceY < 1.0)\r
+                                               parent.createPath(path, x, parent.y1);                                          \r
+                                       else \r
+                                               parent.createPath(path, x, (parent.y0+parent.y1)*0.5);\r
+                                       break;\r
+                               case Constants.WEST:\r
+                                       if(parent.distanceX > -1.0)\r
+                                               parent.createPath(path, parent.x0, y);\r
+                                       else \r
+                                               parent.createPath(path, (parent.x0+parent.x1)*0.5, y);\r
+                                       break;\r
+                               case Constants.NORTH:\r
+                                       if(parent.distanceY > -1.0)\r
+                                               parent.createPath(path, x, parent.y0);\r
+                                       else \r
+                                               parent.createPath(path, x, (parent.y0+parent.y1)*0.5);\r
+                                       break;\r
+                               }                       \r
+                               path.lineTo(makeFinite(x), makeFinite(y));\r
+                       }\r
+               }               \r
+       }\r
+       \r
+       static double makeFinite(double x) {\r
+               if(x == Double.POSITIVE_INFINITY)\r
+                       return 10000.0;\r
+               if(x == Double.NEGATIVE_INFINITY)\r
+                       return -10000.0;\r
+               return x;\r
+       }\r
+       \r
+       public Path2D createPath(double x, double y) {\r
+               Path2D path = new Path2D.Double();\r
+               createPath(path, x, y);\r
+               return path;\r
+       }\r
+       \r
+       @Override\r
+       public String toString() {\r
+               if(parent == null)\r
+                       return Integer.toString(direction.getId());\r
+               else\r
+                       return parent.toString() + " " + Integer.toString(direction.getId());\r
+       }\r
+}\r