view dwtx/draw2d/graph/Segment.d @ 98:95307ad235d9

Added Draw2d code, still work in progress
author Frank Benoit <benoit@tionex.de>
date Sun, 03 Aug 2008 00:52:14 +0200
parents
children
line wrap: on
line source

/*******************************************************************************
 * Copyright (c) 2004, 2005 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
 * Port to the D programming language:
 *     Frank Benoit <benoit@tionex.de>
 *******************************************************************************/
module dwtx.draw2d.graph.Segment;

import dwt.dwthelper.utils;
import tango.text.convert.Format;

import dwtx.draw2d.geometry.Geometry;
import dwtx.draw2d.geometry.Point;
import dwtx.draw2d.graph.Vertex;

/**
 * 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
 */
this(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
 */
bool 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
 */
bool intersects(Point s, Point t) {
    return intersects(s.x, s.y, t.x, t.y);
}

/**
 * @see java.lang.Object#toString()
 */
public String toString() {
    return Format( "{}---{}", start, end ); //$NON-NLS-1$
}

}