package org.iplantc.phyloviewer.shared.scene;
import org.iplantc.phyloviewer.shared.math.Box2D;
import org.iplantc.phyloviewer.shared.math.Matrix33;
import org.iplantc.phyloviewer.shared.math.Vector2;
import org.iplantc.phyloviewer.shared.render.Defaults;
import org.iplantc.phyloviewer.shared.render.IGraphics;
import org.iplantc.phyloviewer.shared.render.style.INodeStyle;
import org.iplantc.phyloviewer.shared.render.style.INodeStyle.Shape;
import org.iplantc.phyloviewer.shared.render.style.IStyle;
public class Point extends Drawable
{
Vector2 point;
Point(Vector2 point)
{
this.point = point;
Box2D box = this.getBoundingBox();
box.expandBy(point);
}
@Override
public void draw(IGraphics graphics, IStyle style)
{
if(graphics != null)
{
// Assume circle.
Shape shape = Shape.SHAPE_CIRCLE;
double pointSize = Defaults.POINT_SIZE;
if(style != null)
{
INodeStyle nodeStyle = style.getNodeStyle();
if(nodeStyle != null)
{
shape = nodeStyle.getShape();
pointSize = nodeStyle.getPointSize();
graphics.setStyle(nodeStyle);
}
}
if(shape == Shape.SHAPE_CIRCLE)
{
graphics.drawPoint(point);
}
else if(shape == Shape.SHAPE_SQUARE)
{
Matrix33 matrix = graphics.getObjectToScreenMatrix();
Vector2 center = matrix.transform(point);
double halfSize = pointSize / 2.0;
Vector2[] vertices = new Vector2[4];
vertices[0] = new Vector2(center.getX() - halfSize, center.getY() - halfSize);
vertices[1] = new Vector2(center.getX() + halfSize, center.getY() - halfSize);
vertices[2] = new Vector2(center.getX() + halfSize, center.getY() + halfSize);
vertices[3] = new Vector2(center.getX() - halfSize, center.getY() + halfSize);
Matrix33 IM = graphics.getScreenToObjectMatrix();
vertices[0] = IM.transform(vertices[0]);
vertices[1] = IM.transform(vertices[1]);
vertices[2] = IM.transform(vertices[2]);
vertices[3] = IM.transform(vertices[3]);
graphics.drawPolygon(vertices);
}
}
}
@Override
public boolean intersect(Vector2 position, double distanceSquared)
{
double distance = position.distanceSquared(point);
return distance < (distanceSquared * 25); // Need to get the point size.
}
@Override
public int getDrawableType()
{
return TYPE_POINT;
}
}