/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: Path.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.routing.experimentalAStar1;
import java.awt.geom.Point2D;
import com.sun.electric.tool.routing.RoutingFrame.RoutingSegment;
/**
* Contains information to route the contained segment and later contains the routing points
*
* @author Christian Jülg
* @author Jonas Thedering
*/
public class Path {
// will be required to actually use the computed path later
RoutingSegment segment;
// Bounding box used to calculate overlap
int minX, maxX, minY, maxY;
int startX, finishX, startY, finishY;
int[] startZ = null, finishZ = null;
boolean startRight, startAbove, finishRight, finishAbove;
// the result of the routing
int[] nodesX, nodesY, nodesZ;
int totalCost;
// set by Master, if true Worker should ignore this Path
boolean pathDone = false;
// set by EndpointMarker or Master
boolean pathUnroutable = false;
public Path(RoutingSegment rs, double dispX, double dispY, double scalingFactor) {
this.segment = rs;
Point2D startLoc = segment.getStartEnd().getLocation();
startX = (int) Math.floor((startLoc.getX() + dispX) / scalingFactor);
startY = (int) Math.floor((startLoc.getY() + dispY) / scalingFactor);
Point2D finishLoc = segment.getFinishEnd().getLocation();
finishX = (int) Math.floor((finishLoc.getX() + dispX) / scalingFactor);
finishY = (int) Math.floor((finishLoc.getY() + dispY) / scalingFactor);
startRight = ((startLoc.getX() + dispX) % scalingFactor) >= scalingFactor / 2;
startAbove = ((startLoc.getY() + dispY) % scalingFactor) >= scalingFactor / 2;
finishRight = ((finishLoc.getX() + dispX) % scalingFactor) >= scalingFactor / 2;
finishAbove = ((finishLoc.getY() + dispY) % scalingFactor) >= scalingFactor / 2;
}
/**
* should be called by worker
*/
public void initialize(){
nodesX = null;
nodesY = null;
nodesZ = null;
totalCost = -1;
}
/** Updates the bounding box according to the current start/finish position */
public void updateBoundingBox() {
minX = Math.min(startX, finishX);
maxX = Math.max(startX, finishX);
minY = Math.min(startY, finishY);
maxY = Math.max(startY, finishY);
}
/** @return if this path's bounding box overlaps the other path's */
public boolean overlaps(Path other) {
return ((minX >= other.minX && minX <= other.maxX) || (other.minX >= minX && other.minX <= maxX))
&& ((minY >= other.minY && minY <= other.maxY) || (other.minY >= minY && other.minY <= maxY));
}
/** @return how much area of this path's bounding box overlaps the other path's */
public int getOverlapAmount(Path other) {
int ox = 0;
if(minX >= other.minX && minX <= other.maxX)
ox = Math.min(maxX, other.maxX) - minX;
else if(other.minX >= minX && other.minX <= maxX)
ox = Math.min(maxX, other.maxX) - other.minX;
else
return 0;
int oy = 0;
if(minY >= other.minY && minY <= other.maxY)
oy = Math.min(maxY, other.maxY) - minY;
else if(other.minY >= minY && other.minY <= maxY)
oy = Math.min(maxY, other.maxY) - other.minY;
else
return 0;
return ox * oy;
}
/** @return an estimate for the length of the final routing */
public int getLengthEstimate() {
Point2D start = segment.getStartEnd().getLocation();
Point2D finish = segment.getFinishEnd().getLocation();
int xDiff = (int) Math.abs(start.getX()-finish.getX());
int yDiff = (int) Math.abs(start.getY()-finish.getY());
return xDiff + yDiff;
}
}