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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g2d.routing.algorithm1;
\r
14 import java.awt.geom.Path2D;
\r
16 import org.simantics.g2d.routing.Constants;
\r
18 public class RoutePencil extends Rectangle {
\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
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
39 switch(direction.getId()) {
\r
40 case Constants.EAST: {
\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
47 case Constants.SOUTH: {
\r
48 distanceX = parent.distanceX;
\r
50 double y = Math.min(parent.y1, y0);
\r
51 distanceConstant = parent.distanceConstant +
\r
52 y * (parent.distanceY - distanceY);
\r
54 case Constants.WEST: {
\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
61 case Constants.NORTH: {
\r
62 distanceX = parent.distanceX;
\r
64 double y = Math.max(parent.y0, y1);
\r
65 distanceConstant = parent.distanceConstant +
\r
66 y * (parent.distanceY - distanceY);
\r
72 double distance(double x, double y) {
\r
73 double result = distanceConstant;
\r
75 result += distanceX * x0 + (x0 - x);
\r
77 result += distanceX * x1 + (x - x1);
\r
79 result += distanceX * x;
\r
81 result += distanceY * y0 + (y0 - y);
\r
83 result += distanceY * y1 + (y - y1);
\r
85 result += distanceY * y;
\r
90 return distanceConstant + distanceX * x0 + distanceY * y0;
\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
99 case Constants.SOUTH:
\r
100 path.moveTo(x, y0);
\r
102 case Constants.WEST:
\r
103 path.moveTo(x1, y);
\r
105 case Constants.NORTH:
\r
106 path.moveTo(x, y1);
\r
110 path.moveTo(makeFinite(x), makeFinite(y));
\r
113 if(parent.contains(x, y))
\r
114 parent.createPath(path, x, y);
\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
121 parent.createPath(path, (parent.x0+parent.x1)*0.5, y);
\r
123 case Constants.SOUTH:
\r
124 if(parent.distanceY < 1.0)
\r
125 parent.createPath(path, x, parent.y1);
\r
127 parent.createPath(path, x, (parent.y0+parent.y1)*0.5);
\r
129 case Constants.WEST:
\r
130 if(parent.distanceX > -1.0)
\r
131 parent.createPath(path, parent.x0, y);
\r
133 parent.createPath(path, (parent.x0+parent.x1)*0.5, y);
\r
135 case Constants.NORTH:
\r
136 if(parent.distanceY > -1.0)
\r
137 parent.createPath(path, x, parent.y0);
\r
139 parent.createPath(path, x, (parent.y0+parent.y1)*0.5);
\r
142 path.lineTo(makeFinite(x), makeFinite(y));
\r
147 static double makeFinite(double x) {
\r
148 if(x == Double.POSITIVE_INFINITY)
\r
150 if(x == Double.NEGATIVE_INFINITY)
\r
155 public Path2D createPath(double x, double y) {
\r
156 Path2D path = new Path2D.Double();
\r
157 createPath(path, x, y);
\r
162 public String toString() {
\r
164 return Integer.toString(direction.getId());
\r
166 return parent.toString() + " " + Integer.toString(direction.getId());
\r