package testinggrounds;
import graphics.common.Box;
import java.awt.Color;
import java.awt.Graphics2D;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import graphics.java.BezierCurve;
import graphics.common.GraphicsObject;
import graphics.java.Oval;
import graphics.common.Point;
import graphics.common.Point2D;
import graphics.common.Size;
import graphics.common.Size2D;
public class Network implements GraphicsObject {
private Point mNetworkTranslation;
private List<Node> mNodes;
private static final int INTENSITY_MAX = 100;
private static final int CURVE_GRANULARITY = 50;
private static final Size OVAL_SIZE = new Size2D( 30, 15 );
public Network() {
mNetworkTranslation = new Point2D( 0, 0 ); //not using this yet
mNodes = new LinkedList<Node>();
}
class Node implements GraphicsObject {
public Node( GraphicsObject graphic ) {
mGraphic = graphic;
mEdgeLines = new LinkedList<BezierCurve>();
mEdges = new LinkedList<Node>();
mGenerator = new Random( System.nanoTime() );
}
public void addEdge( Node other ) {
mEdges.add( other );
generateLine( other );
}
private void generateLine( Node other ) {
Point p1 = new Point2D(), p2 = new Point2D(), p3 = new Point2D(), p4 = new Point2D();
placeAnchors( other, p1, p2, p3, p4 );
mEdgeLines.add( new BezierCurve( new Point2D( p1 ), new Point2D( p2 ), new Point2D( p3 ), new Point2D( p4 ),
new Color( 150, 0, 150 ), CURVE_GRANULARITY ) );
randomizeAnchors( p1, p2, p3, p4 );
mEdgeLines.add( new BezierCurve( p1, p2, p3, p4,
new Color( 150, 0, 150 ), CURVE_GRANULARITY ) );
}
private void placeAnchors( Node other, Point p1, Point p2, Point p3, Point p4 ) {
Point[] tpoints = mGraphic.getPoints();
Size[] tsize = mGraphic.getSize();
Point[] opoints = other.getPoints();
Size[] osize = other.getSize();
p1.modify( new Point2D( tpoints[ 0].getX() + tsize[ 0].getWidth() / 2,
tpoints[ 0].getY() + tsize[ 0].getHeight() / 2 ) );
p4.modify( new Point2D( opoints[ 0].getX() + osize[ 0].getWidth() / 2,
opoints[ 0].getY() + osize[ 0].getHeight() / 2 ) );
p2.modify( new Point2D( p1.getX() + (opoints[ 0].getX() - tpoints[ 0].getX()) / 3,
p1.getY() + (opoints[ 0].getY() - tpoints[ 0].getY()) / 3 ) );
p3.modify( new Point2D( p4.getX() - (opoints[ 0].getX() - tpoints[ 0].getX()) / 3,
p4.getY() - (opoints[ 0].getY() - tpoints[ 0].getY()) / 3 ) );
}
private void randomizeAnchors( Point p1, Point p2, Point p3, Point p4 ) {
int curveIntensity = mGenerator.nextInt( INTENSITY_MAX );
if ( p1.getX() < p4.getX() ) {
if ( p1.getY() < p4.getY() ) {
if ( mGenerator.nextInt( 5000 ) < 2500 ) {
p2.modify( new Point2D( curveIntensity, curveIntensity ) );
p3.modify( new Point2D( curveIntensity, -curveIntensity ) );
} else {
p2.modify( new Point2D( -curveIntensity, curveIntensity ) );
p3.modify( new Point2D( -curveIntensity, -curveIntensity ) );
}
} else {
p2.modify( new Point2D( 0, curveIntensity ) );
p3.modify( new Point2D( curveIntensity, 0 ) );
}
} else if ( p1.getY() < p4.getY() ) {
p2.modify( new Point2D( 0, -curveIntensity ) );
p3.modify( new Point2D( -curveIntensity, 0 ) );
} else {
p2.modify( new Point2D( 0, curveIntensity ) );
p3.modify( new Point2D( -curveIntensity, 0 ) );
}
}
@Override
public void draw( Graphics2D g, double delta ) {
for ( BezierCurve bc : mEdgeLines ) {
bc.draw( g, delta );
}
mGraphic.draw( g, delta );
}
@Override
public String getName() {
return "networknode";
}
@Override
public Point[] getPoints() {
return mGraphic.getPoints();
}
@Override
public Size[] getSize() {
return mGraphic.getSize();
}
@Override
public Box[] getBox() {
return mGraphic.getBox();
}
@Override
public boolean equals( Object other ) {
if ( other == this ) {
return true;
}
if ( !(other instanceof Node) ) {
return false;
}
Node otherNode = (Node) other;
if ( mGraphic.getPoints()[ 0].equals( otherNode.mGraphic.getPoints()[ 0] )
&& mGraphic.getSize()[ 0].equals( otherNode.mGraphic.getSize()[ 0] ) ) {
return true;
}
return false;
}
@Override
public void dispose() {
}
private GraphicsObject mGraphic;
private List<BezierCurve> mEdgeLines;
private List<Node> mEdges;
private Random mGenerator;
}
public void addNode( Point loc ) {
mNodes.add( new Node( new Oval( loc, OVAL_SIZE ) ) );
}
public void addNode( Node n ) {
mNodes.add( n );
}
public void addEdge( Node n1, Node n2 ) {
int n1i = mNodes.indexOf( n1 );
int n2i = mNodes.indexOf( n2 );
if ( n1i < 0 || n2i < 0 ) {
return;
}
mNodes.get( n1i ).addEdge( n2 );
}
public void generateRandom( Size networkSize, int numNodes ) {
}
@Override
public void draw( Graphics2D g, double delta ) {
for ( GraphicsObject go : mNodes ) {
go.draw( g, delta );
}
}
@Override
public String getName() {
return "network";
}
@Override
public Point[] getPoints() {
return new Point[]{ mNetworkTranslation };
}
@Override
public Size[] getSize() {
return null;
}
@Override
public Box[] getBox() {
throw new UnsupportedOperationException();
}
@Override
public void dispose() {
}
}