summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/graph/Edge.java
blob: 86bfe1320a1cc4ac8de40ce4523d04f04f400e4b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package org.openslx.graph;

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 final int _maxHealth;
	private int _health;

	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++;
		_weight = 0;
	}

	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;
	}

}