package graph; import java.util.List; import java.util.Arrays; /** * Diese Klasse Knoten definiert einen Knoten. * Knoten haben eine Position, eine Farbe und einen Wert für sonstige Codierungszwecke und sind markiert und/oder besucht. * Im Infotext kann eine zusätzliche Information für die Anzeige gespeichert werden. * * @author Dirk Zechnall, Thomas Schaller * @version 22.07.2020 (v6.4) */ public class Knoten extends GraphElement { private String infotext; private double wert; // wird z.B. fuer den Colorierungs-Algorithmus verwendet - speichert da die Farben (codiert als Zahlen) private boolean istMarkiert = false; private boolean istBesucht = false; private int x; private int y; private int farbe = -1; /** * Der Konstruktor erstellt einen neuen Knoten mit einem neuen Namen * * @param x x-Position des Knotens * @param y y-Position des Knotens */ public Knoten(int x, int y) { this.x = x; this.y = y; wert = 0; infotext = ""; } /** * Der Konstruktor erstellt einen neuen Knoten mit einem Startwert * * @param x x-Position des Knotens * @param y y-Position des Knotens * @param neuerWert Der neue Wert des Knotens */ public Knoten(int x, int y, double neuerWert) { this.x = x; this.y = y; wert = neuerWert; infotext = ""; } /** * Setzt den Status eines Knotens aus einem Status-String * Format: wert,markiert,besucht,farbe * wobei wert eine double-Zahl, mariert und besucht ein boolean-Wert (0=false, 1 = true) und * farbe eine zahl ist. * * @param status Der Statusstring */ public void setStatus(String status) { List items = Arrays.asList(status.split("\\s*,\\s*")); this.wert = Double.parseDouble(items.get(0)); // wird z.B. fuer den Colorierungs-Algorithmus verwendet - speichert da die Farben (codiert als Zahlen) this.istMarkiert = items.get(1).equals("1"); this.istBesucht = items.get(2).equals("1"); this.farbe = Integer.parseInt(items.get(3)); } /** * Liefert den Status eines Knotens als Status-String * Format: wert,markiert,besucht,farbe * wobei wert eine double-Zahl, mariert und besucht ein boolean-Wert (0=false, 1 = true) und * farbe eine zahl ist. * * @return Der Statusstring */ public String getStatus() { return ""+wert+","+(istMarkiert ? "1," : "0,")+ (istBesucht ? "1," : "0,")+ farbe; } /** * Die Methode init initialisiert den Zustand eines Knotens */ protected void init() { wert = 0.0; farbe = -1; istMarkiert = false; istBesucht = false; } /** Setzt den Infotext für einen Knoten * @param infotext Der neue Text */ public void setInfotext(String infotext) { this.infotext = infotext; } /** Liefert den Infotext des Knotens * @return Der Infotext */ public String getInfotext(){ return infotext; } /** * Setzt den Wert beim Knoten * * @param neuerWert Der neu zu setzende Wert */ public void setWert(double neuerWert) { wert = neuerWert; } /** * Gibt den Wert vom Knoten als Integer-Wert zurueck * * @return Wert des Knotens */ public int getIntWert() { return (int) wert; } /** * Gibt den Wert vom Knoten als Double-Wert zurueck * * @return Wert des Knotens */ public double getDoubleWert() { return wert; } /** * Setzt das Markiertattribut vom Knoten * * @param markiert Der neu zu setzende Markiertwert */ public void setMarkiert(boolean markiert) { istMarkiert = markiert; } /** * Gibt den Markiertwert vom Knoten zurueck * * @return markiert? */ public boolean isMarkiert() { return istMarkiert; } /** * Setzt das Besuchtattribut vom Knoten * * @param markiert Der neu zu setzende Besuchtwert */ public void setBesucht(boolean markiert) { istBesucht = markiert; } /** * Gibt den Besuchtwert vom Knoten zurueck * * @return besucht? */ public boolean isBesucht() { return istBesucht; } /** * Gibt den Index der Farbe des Knoten zurück. * Standardmäßig hängt die Farbe von den Attributen markiert und besucht ab. * Durch Setzen der Farbe kann die Farbe gezielt gesetzt werden. * @return Farbe des Knotens */ public int getFarbe() { if (farbe == -1) { int f = 0; if(istMarkiert) { f += 1; } if(istBesucht) { f += 2; } return f; } return farbe; } /** * Setzt den Index der Farbe des Knoten. * Standardmäßig hängt die Farbe von den Attributen markiert, besucht und beendet ab. * Durch Setzen der Farbe kann die Farbe gezielt gesetzt werden. * @param farbe Index der Farbe (0-19) */ public void setFarbe(int farbe) { this.farbe = farbe; } /** Gibt zurück, ob die Knotenfarbe automatisch aus den Attributen ermittelt wird. * @return true=Farbe wird automatisch bestimmt, false=Farbe wurde explizit gesetzt. */ public boolean isFarbeAutomatisch() { return this.farbe == -1; } /** Legt fest, ob die Knotenfarbe automatisch aus den Attributen ermittelt wird. * @param auto true=Farbe wird automatisch bestimmt, * false=Farbe wird explizit gesetzt. */ public void setFarbeAutomatisch(boolean auto) { if(auto) { farbe = -1; } else { if(farbe == -1) farbe = 0; } } /** Liefert die x-Position des Knotens * @return x-Postion */ public int getX() { return x; } /** Liefert die y-Position des Knotens * @return y-Postion */ public int getY() { return y; } /** Setzt die x-Position des Knotens * @param x x-Postion */ public void setX(int x) { this.x = x; } /** Setzt die y-Position des Knotens * @param y y-Postion */ public void setY(int y) { this.y = y; } /** Vergleicht den Knoten mit einem anderen Knoten bezüglich seines Werts * @param e anderer Knoten * @return kleiner 0 der andere Knoten hat einen größeren Wert, größer 0 der andere Knoten hat einen kleineren Wert, gleich 0 beide sind gleich */ public int compareTo(GraphElement e) { double w1, w2; if(e instanceof Knoten) w1 = ((Knoten) e).getDoubleWert(); else w1 = ((Kante) e).getGewicht(); w2 = getDoubleWert(); return (int) (w2-w1); } /** * Die Methode ueberschreibt die Methode toString() und gibt die String-Raepraesentation eines Knotens zurueck * * @return String-Raepraesentation des Knotens */ @Override public String toString() { return "["+infotext+","+wert+","+istMarkiert+","+istBesucht+"]"; } }