From 45ada5475192f6afc9645c401de46765be87ee3f Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Thu, 21 May 2015 16:39:25 +0200 Subject: Lean and mean first prototype - to be improved! --- src/main/java/org/openslx/graph/Edge.java | 128 ++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 src/main/java/org/openslx/graph/Edge.java (limited to 'src/main/java/org/openslx/graph/Edge.java') diff --git a/src/main/java/org/openslx/graph/Edge.java b/src/main/java/org/openslx/graph/Edge.java new file mode 100644 index 0000000..ece5250 --- /dev/null +++ b/src/main/java/org/openslx/graph/Edge.java @@ -0,0 +1,128 @@ +package org.openslx.graph; + +import java.awt.Color; + +import org.apache.commons.math3.util.FastMath; + +public class Edge implements java.io.Serializable +{ + private static final long serialVersionUID = 4401455477347084262L; + private Node _source; + private Node _target; + private double _weight; + private String _id = null; + private int _age = 0; + private static final Color[] COLORS = new Color[ 20 ]; + private final int _maxHealth; + private int _health; + + static + { + for ( int i = 0; i < COLORS.length; ++i ) { + int r = blend( 255, 100, i, COLORS.length - 1 ); + int g = blend( 0, 100, i, COLORS.length - 1 ); + int b = blend( 0, 255, i, COLORS.length - 1 ); + COLORS[i] = new Color( r, g, b ); + } + } + + private static int blend( int a, int b, int current, int max ) + { + a *= a; + b *= b; + return (int)FastMath.sqrt( ( ( b * current ) + ( a * ( max - current ) ) ) / max ); + } + + public Edge( Node source, Node target ) + { + // Note that this graph is actually undirected. + _source = source; + _target = target; + _weight = 0; + _maxHealth = Math.max( source.getMaxHealth(), target.getMaxHealth() ); + _health = _maxHealth; + } + + public void resetWeight() + { + if ( _health == _maxHealth && _maxHealth != 1 && _source.wasActivated() && _target.wasActivated() ) { + _health = 1; + } else { + _health--; + } + _age++; + } + + public boolean isAlive() + { + return _health > 0; + } + + public void addWeight( double weight ) + { + _weight += weight; + _health = _maxHealth; + } + + public double getWeight() + { + return _weight; + } + + public Node getSource() + { + return _source; + } + + public Node getTarget() + { + return _target; + } + + public boolean equals( Object o ) + { + if ( o instanceof Edge ) { + Edge other = (Edge)o; + return ( _source.equals( other._source ) && _target.equals( other._target ) ) || ( _source.equals( other._target ) && _target.equals( other._source ) ); + } + return false; + } + + public boolean hasNode( Node node ) + { + return _source.equals( node ) || _target.equals( node ); + } + + public double getLengthSquared() + { + final double dx = _source.getX() - _target.getX(); + final double dy = _source.getY() - _target.getY(); + return dx * dx + dy * dy; + } + + public int hashCode() + { + return _source.hashCode() ^ _target.hashCode(); + } + + public String toString() + { + return _source + " " + _target + " w(" + _weight + ")"; + } + + public String getId() + { + if ( _id == null ) { + if ( _source.getId().compareTo( _target.getId() ) > 0 ) + _id = _target.getId() + "==" + _source.getId(); + _id = _source.getId() + "==" + _target.getId(); + } + return _id; + } + + public Color getColor() + { + return COLORS[_age >= COLORS.length ? COLORS.length - 1 : _age]; + } + +} -- cgit v1.2.3-55-g7522