zpg-graphentester/graph/Knoten.java
2021-07-12 14:04:20 +02:00

263 lines
7.1 KiB
Java

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<String> 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+"]";
}
}