GraphEdge.java

/*
 *     YAV (Yet another Visualiser)
 *     (c) 2004 by Robin Quast
 *    Version 1.0 (04.03.2004)
 *    
 *  erstellt im Rahmen der Diplomarbeit
 * "Theorie und Java- Realisierung
 *  ausgewählter Algorithmen zur
 *  Bestimmung kürzester Wege in Graphen"
 *
 *  betreut durch Prof. Dr. Lenze
 *  an der Fachhochschule Dortmund
 *  im SS 2003/ WS 2003/2004
 *
 *  @(#)GraphEdge.java  1.0 04/03/09
 */


import java.awt.*;
import java.io.*;
import java.awt.geom.*;

/** Diese Klasse dient für die zusätzliche Datenhaltung, wie z.B. Farbe der 
 * Kante, die nicht in der Klasse Edge definiert ist.
 */
class GraphEdge
extends Edge 
implements Comparable
{
  
  Object shape = null;
  Color color = Color.white;
  
  /** Konstruktor, der eine Kante mit den Kosten -1 erzeugt. Wobei die Knoten
   * mit dem Konstuktor new Node() erzeugt werden. Der Shape Line2D.Double().
   
   */  
  public GraphEdge () {
    head = new Node();
    tail = new Node();
    cost = -1;
    shape = new Line2D.Double();
  }
  
  /** Konstruktor der. Die Kante e übernimmt und den Shape s.
   */  
  public GraphEdge (Edge e, Object s) {
    head = e.getHead();
    tail = e.getTail();
    cost = e.getCost();
    shape = s;
  }
        
  /** Konstruktor der die Eigenschaften der übergebenen GraphEdge übernimmt.
   */
  public GraphEdge (GraphEdge ge) {
    head = ge.getHead();
    tail = ge.getTail();
    cost = ge.getCost();
    shape = ge.shape;
  }
  
  /** Konstruktor, der die Kante, bestehend aus den Werten <I>t</I>
   * f&uuml;r tail Knoten, <I>h</I> f&uuml;r head Knoten, <I>c</I> f&uuml;r Kosten der Kante
   * und den shape s, &uuml;bernimmt.
   */
  public GraphEdge (int t,int h,int c, Object s) {
    head = new Node(h);
    tail = new Node(t);
    cost = c;
    shape = s;
  }

  /** Konstruktor, der die Kante, bestehend aus den Werten <I>t</I>
   * f&uuml;r tail Knoten, <I>h</I> f&uuml;r head Knoten, <I>c</I> f&uuml;r Kosten der Kante
   * und den shape s, &uuml;bernimmt.
   */
  public GraphEdge (Node t,Node h,int c, Object s) {
    head = new Node(h);
    tail = new Node(t);
    cost = c;
    shape = s;
  }
    
  /** Setzt die Farbe in der die Kante gemalt werden soll.
   */
  public void setColor (Color c) {
    color = c;
  }
  
  /** Holt die Farbe, in der die Kante gemalt werden soll.
   */
  public Color getColor() {
    return color;
  }
  
  /** Setzt den Shape der Kante.
   */
    public void setShape(Object s){
         shape = s;
    }
    
    /** Holt den Shape der Kante.
     */
  public Object getShape() {
    return shape;
  }

  /** Aufruf der Routine ist deaktiviert, da die gebogenen Kanten mittels
   * Rotation erzeugt werden ist hier ein einfaches Abfragen der &uuml;berlappung
   * nicht so einfach m&ouml;glich.
   */
  public boolean intersects (Point p) {
    Line2D.Double l2d = new Line2D.Double();
    QuadCurve2D.Double qc2d = new QuadCurve2D.Double();
    CubicCurve2D.Double cc2d = new CubicCurve2D.Double();
    boolean rc=false;
    int korrektur=4;
    System.out.println("Vergleichs Punkt:"+p);
    //if (shape.getClass().isInstance((Object)l2d)) rc= ((Line2D.Double)shape).contains(p.getX()-korrektur,p.getY()-korrektur,p.getX()+korrektur,p.getY()+korrektur);
    //Rectangle2D.Double r = new Rectangle2D.Double (p.getX()-korrektur/2,p.getY()-korrektur/2,korrektur,korrektur);
    Rectangle r = new Rectangle(p.x,p.y,korrektur,korrektur);
    if ((shape.getClass().isInstance((Object)l2d)) && (((Line2D.Double)shape).ptLineDist(p.getX(),p.getY())<3)) rc=true;
    if (shape.getClass().isInstance((Object)qc2d)){
       rc= ((QuadCurve2D.Double)shape).intersects(r);
/*
       QuadCurve2D.Double test=(QuadCurve2D.Double)shape;
       System.out.println("Punkt1:"+test.getP1());
       System.out.println("Punkt2:"+test.getP2());
       AffineTransform at = new AffineTransform();
       PathIterator pi=test.getPathIterator(at);
       System.out.println("ohne Rotation");
          Point2D[] points = new Point2D[100];
          int num_pts = 0;
          while ( !pi.isDone() ) {
              float[] pt = new float[6];
              switch ( pi.currentSegment(pt) ) {
                  case FlatteningPathIterator.SEG_MOVETO:
                  case FlatteningPathIterator.SEG_LINETO:
                for (int i=0;i<pt.length;i++) System.out.println("Punkte "+i+":"+pt[i]+","+pt[i]);
                      points[num_pts] = new Point2D.Float(pt[i], pt[i+1]);
                      //System.out.println(points[num_pts]);
                      num_pts++;
              }
              pi.next();
          }
          
      System.out.println("mit Rotation");
       at=getAffineTransform();
       pi=test.getPathIterator(at);
          points = new Point2D[100];
          num_pts = 0;
          while ( !pi.isDone() ) {
              float[] pt = new float[6];
              switch ( pi.currentSegment(pt) ) {
                  case PathIterator.SEG_MOVETO:
                  case PathIterator.SEG_LINETO:
                  for (int i=0;i<points.length;i++) System.out.println("Punkte "+i+":"+pt[0]+","+pt[1]);
                      points[num_pts] = new Point2D.Float(pt[0], pt[1]);
                      //System.out.println(points[num_pts]);
                      num_pts++;
              }
              pi.next();
          }
*/
    }
    if (shape.getClass().isInstance((Object)cc2d)) rc= ((CubicCurve2D.Double)shape).intersects(p.getX()-korrektur,p.getY()-korrektur,p.getX()+korrektur,p.getY()+korrektur);
    return rc;
  }
  
  /** Gibt die Kante als Edge Element ohne Farb und Shapeinfos zur&uuml;ck.
   */
  public Edge getEdge() {
    return new Edge(tail,head,cost);
  }
  
  /** Setzt die Kante, bzw. die Knoten.
   */
  public void setEdge(Node t, Node h, int c) {
    tail = t;
    head = h;
    cost = c;
  }
  
  /** Vergleichswert der GraphEdge ist genauso definiert, wie die Methode
   * compareTo in der Klasse Edge.
   */
     public int compareTo (GraphEdge n) {
    return compareTo(n.getEdge());
  }
  
  /** Gibt die Kante als String aus.
   */  
  public String toString() {
    return "["+new Edge(tail,head,cost)+","+shape.toString()+","+color.toString()+"]";
  }
}