/*
* 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ür tail Knoten, <I>h</I> für head Knoten, <I>c</I> für Kosten der Kante
* und den shape s, ü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ür tail Knoten, <I>h</I> für head Knoten, <I>c</I> für Kosten der Kante
* und den shape s, ü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 überlappung
* nicht so einfach mö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ü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()+"]";
}
}
|