package com.bioxx.jmapgen.com.nodename.delaunay;
import java.util.Vector;
import com.bioxx.jmapgen.Point;
public class Vertex implements ICoord
{
static final Vertex VERTEX_AT_INFINITY = new Vertex(Double.NaN, Double.NaN);
private static Vector<Vertex> _pool = new Vector<Vertex>();
private static Vertex create(double x, double y)
{
if (Double.isNaN(x) || Double.isNaN(y))
{
return VERTEX_AT_INFINITY;
}
if (_pool.size() > 0)
{
Vertex v = _pool.lastElement();
_pool.remove(_pool.size()-1);
v.init(x,y);
return v;
}
else
{
return new Vertex(x, y);
}
}
private static int _nvertices = 0;
private Point _coord;
public Point getCoord()
{
return _coord;
}
private int _vertexIndex;
public int getVertexIndex()
{
return _vertexIndex;
}
public Vertex(double x, double y)
{
init(x, y);
}
private Vertex init(double x, double y)
{
_coord = new Point(x, y);
return this;
}
public void dispose()
{
_coord = null;
_pool.add(this);
}
public void setIndex()
{
_vertexIndex = _nvertices++;
}
public String toString()
{
return "Vertex (" + _vertexIndex + ")";
}
/**
* This is the only way to make a Vertex
*
* @param halfedge0
* @param halfedge1
* @return
*
*/
public static Vertex intersect(Halfedge halfedge0, Halfedge halfedge1)
{
Edge edge0, edge1, edge;
Halfedge halfedge;
double determinant, intersectionX, intersectionY;
boolean rightOfSite;
edge0 = halfedge0.edge;
edge1 = halfedge1.edge;
if (edge0 == null || edge1 == null)
{
return null;
}
if (edge0.getRightSite() == edge1.getRightSite())
{
return null;
}
determinant = edge0.a * edge1.b - edge0.b * edge1.a;
if (-1.0e-10 < determinant && determinant < 1.0e-10)
{
// the edges are parallel
return null;
}
intersectionX = (edge0.c * edge1.b - edge1.c * edge0.b)/determinant;
intersectionY = (edge1.c * edge0.a - edge0.c * edge1.a)/determinant;
if (Voronoi.compareByYThenX(edge0.getRightSite(), edge1.getRightSite()) < 0)
{
halfedge = halfedge0; edge = edge0;
}
else
{
halfedge = halfedge1; edge = edge1;
}
rightOfSite = intersectionX >= edge.getRightSite().getX();
if ((rightOfSite && halfedge.leftRight == LR.LEFT)
|| (!rightOfSite && halfedge.leftRight == LR.RIGHT))
{
return null;
}
return Vertex.create(intersectionX, intersectionY);
}
public double getX()
{
return _coord.x;
}
public double getY()
{
return _coord.y;
}
}