RouteLine line;
- RouteTerminal(double x, double y, double minX, double minY,
+ public RouteTerminal(double x, double y, double minX, double minY,
double maxX, double maxY, int allowedDirections,
boolean routeToBounds,
ILineEndStyle style, RouteTerminalPosition dynamicPosition) {
* adding necessary transient route lines.
* @param cache
*/
- void route(ArrayList<RouteLine> lines, IntervalCache cache, boolean boundingBoxesIntersect) {
+ protected void route(ArrayList<RouteLine> lines, IntervalCache cache, boolean boundingBoxesIntersect) {
if(routeToBounds) {
int lineDir;
boolean routeLineDoesNotIntersectTerminal;
return;
}
else {
- line.addPoint(this);
+ if (!line.getPoints().contains(this))
+ line.addPoint(this);
Interval interval = cache.get(line);
if(line.isHorizontal) {
if(interval.min < minX)
boolean routeLineDoesNotIntersectTerminal;
double linePosition = line.position;
if(line.isHorizontal) {
+ if (linePosition == y) {
+ // direct route to terminal
+ line.addPoint(this);
+ return;
+ }
lineDir = linePosition < y ? 3 : 1;
routeLineDoesNotIntersectTerminal = linePosition <= minY || linePosition >= maxY
|| boundingBoxesIntersect /* we ignore intersection in this case */;
}
else {
+ if (linePosition == x) {
+ // direct route to terminal
+ line.addPoint(this);
+ return;
+ }
lineDir = linePosition < x ? 2 : 0;
routeLineDoesNotIntersectTerminal = linePosition <= minX || linePosition >= maxX
|| boundingBoxesIntersect /* we ignore intersection in this case */;
}
// We can route the connection directly to the right direction
- if(routeLineDoesNotIntersectTerminal &&
+ if((routeLineDoesNotIntersectTerminal ||
+ (line.isHorizontal && (x == minX || x == maxX)) || // already on the top/bottom edge
+ (!line.isHorizontal && (y == minY || y == maxY)) // already on the left/right edge
+ ) &&
Directions.isAllowed(allowedDirections, lineDir)) {
RouteLine line0 = createLine0(lineDir);
new RouteLink(line0, line);
}
}
- private RouteLine createLine0(int dir) {
+ protected RouteLine createLine0(int dir) {
RouteLine line0 = (dir&1) == 0
? new RouteLine(true, y)
: new RouteLine(false, x)
}
}
- RouteTerminal copy(THashMap<Object, Object> map) {
+ public RouteTerminal copy(THashMap<Object, Object> map) {
RouteTerminal copy = (RouteTerminal)map.get(this);
if(copy == null) {
copy = new RouteTerminal(x, y, minX, minY, maxX, maxY,
return line;
}
+ public void setLine(RouteLine line) {
+ this.line = line;
+ }
+
public void setMinX(double minX) {
this.minX = minX;
}
public RouteTerminalPosition getDynamicPosition() {
return dynamicPosition;
}
+
+
public boolean updateDynamicPosition() {
boolean changed = false;