blob: 3e438bbef409397b8b5f7d5a5ad86ba7913d2c7f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.graph;
import org.eclipse.draw2d.geometry.Geometry;
import org.eclipse.draw2d.geometry.Point;
/**
* A Segment representation for the ShortestPathRouting. A segment is a line
* between two vertices.
*
* This class is for internal use only
*
* @author Whitney Sorenson
* @since 3.0
*/
class Segment {
Vertex start, end;
/**
* Creates a segment between the given start and end points.
*
* @param start
* the start vertex
* @param end
* the end vertex
*/
Segment(Vertex start, Vertex end) {
this.start = start;
this.end = end;
}
/**
* Returns the cosine of the made between this segment and the given segment
*
* @param otherSegment
* the other segment
* @return cosine value (not arc-cos)
*/
double cosine(Segment otherSegment) {
double cos = (((start.x - end.x) * (otherSegment.end.x - otherSegment.start.x)) + ((start.y - end.y) * (otherSegment.end.y - otherSegment.start.y)))
/ (getLength() * otherSegment.getLength());
double sin = (((start.x - end.x) * (otherSegment.end.y - otherSegment.start.y)) - ((start.y - end.y) * (otherSegment.end.x - otherSegment.start.x)));
if (sin < 0.0)
return (1 + cos);
return -(1 + cos);
}
/**
* Returns the cross product of this segment and the given segment
*
* @param otherSegment
* the other segment
* @return the cross product
*/
long crossProduct(Segment otherSegment) {
return (((start.x - end.x) * (otherSegment.end.y - end.y)) - ((start.y - end.y) * (otherSegment.end.x - end.x)));
}
private double getLength() {
return (end.getDistance(start));
}
/**
* Returns a number that represents the sign of the slope of this segment.
* It does not return the actual slope.
*
* @return number representing sign of the slope
*/
double getSlope() {
if (end.x - start.x >= 0)
return (end.y - start.y);
else
return -(end.y - start.y);
}
/**
* Returns true if the given segment intersects this segment.
*
* @param sx
* start x
* @param sy
* start y
* @param tx
* end x
* @param ty
* end y
* @return true if the segments intersect
*/
boolean intersects(int sx, int sy, int tx, int ty) {
return Geometry.linesIntersect(start.x, start.y, end.x, end.y, sx, sy,
tx, ty);
}
/**
* Return true if the segment represented by the points intersects this
* segment.
*
* @param s
* start point
* @param t
* end point
* @return true if the segments intersect
*/
boolean intersects(Point s, Point t) {
return intersects(s.x, s.y, t.x, t.y);
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return start + "---" + end; //$NON-NLS-1$
}
}