//
// LineJ3D.java
//
/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/
package visad.bom.annotations;
import visad.DisplayImpl;
import visad.java3d.DisplayImplJ3D;
/**
* Meant to encapsulate information representing a Line which is
* going to be rendered on a VisAD display without being
* subject to the usual VisAD transformations. Thus the label should
* stick in Screen Coordinates.
*/
public class LineJ3D implements ScreenAnnotation
{
/** line style SOLID */
public static final int SOLID = 4;
/** line style DASH */
public static final int DASH = 5;
/** line style DOT */
public static final int DOT = 6;
/** line style DASH_DOT */
public static final int DASH_DOT = 7;
private int style;
private int x1, y1; // points of line in screen coordinates
private int x2, y2;
private float[] colour;
private double zValue;
private double thickness; // for line and point style
/**
* Simple constructor which makes a zero length line at (0, 0)
* coloured white. More meaningful values can be set
* after construction.
*/
public LineJ3D()
{
this(SOLID, 0, 0, 0, 0,
new float[] {1,1,1}, 0.0, 1.0);
}
/**
* Constructs a solid LineJ3D from 2 points specified
* in screen coordinates.
*
* @param x1 x screen coordinate of the first point.
* @param y1 y screen coordinate of the first point.
* @param x2 x screen coordinate of the second point.
* @param y2 y screen coordinate of the second point.
* @param colour red green blue triple; each value in [0.0, 1.0].
* @param zValue Virtual world value; larger z is in front.
* @param thickness of the line.
*/
public LineJ3D(int x1, int y1, int x2, int y2,
float[] colour, double zValue, double thickness)
{
this(SOLID, x1,y1, x2,y2,
colour, zValue, thickness);
}
/**
* Constructs a LineJ3D from 2 points specified in screen coordinates.
*
* @param style one of: <ul>
* <li> LineJ3D.SOLID
* <li> LineJ3D.DASH
* <li> LineJ3D.DOT
* <li> LineJ3D.DASH_DOT </ul>
* @param points 2 rows with each column containing a point
* in screen coordinates; requires 2 points (columns).
* @param colour red green blue triple; each value in [0.0, 1.0].
* @param zValue Virtual world value; larger z is in front
* @param thickness of the line.
*/
public LineJ3D(int style, int[][] points,
float[] colour, double zValue, double thickness)
{
this(style, points[0][0], points[1][0],
points[0][1], points[1][1],
colour, zValue, thickness);
}
/**
* Constructs a LineJ3D from 2 points specified
* in screen coordinates.
*
* @param style one of: <ul>
* <li> LineJ3D.SOLID
* <li> LineJ3D.DASH
* <li> LineJ3D.DOT
* <li> LineJ3D.DASH_DOT </ul>
* @param x1 x screen coordinate of the first point.
* @param y1 y screen coordinate of the first point.
* @param x2 x screen coordinate of the second point.
* @param y2 y screen coordinate of the second point.
* @param colour red green blue triple; each value in [0.0, 1.0].
* @param zValue Virtual world value; larger z is in front.
* @param thickness of the line.
*/
public LineJ3D(int style,
int x1, int y1, int x2, int y2,
float[] colour, double zValue, double thickness)
{
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.style = style;
this.colour = colour;
this.zValue = zValue;
this.thickness = thickness;
}
/**
* Set the coordinates for the start and end points of the LineJ3D.
*
* @param x1 x screen coordinate of the first point.
* @param y1 y screen coordinate of the first point.
* @param x2 x screen coordinate of the second point.
* @param y2 y screen coordinate of the second point.
*/
public void setPoints(int x1, int y1, int x2, int y2)
{
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
/**
* Set the coordinates for the start and end points of the LineJ3D.
*
* @param points 2 rows with each column containing a point
* in screen coordinates; requires 2 points (columns).
*/
public void setPoints(int[][] points)
{
setPoints(points[0][0], points[1][0],
points[0][1], points[1][1]);
}
/**
* Set the line style for the LineJ3D.
*
* @param style one of: <ul>
* <li> LineJ3D.SOLID
* <li> LineJ3D.DASH
* <li> LineJ3D.DOT
* <li> LineJ3D.DASH_DOT </ul>
*/
public void setStyle(int style)
{
this.style = style;
}
/**
* Set the colour for the LineJ3D.
*
* @param colour red green blue triple; each value in [0.0, 1.0].
*/
public void setColour(float[] colour)
{
this.colour = colour;
}
/**
* Set the Z value for the LineJ3D.
*
* @param zValue Virtual world value; larger z is in front.
*/
public void setZValue(double zValue)
{
this.zValue = zValue;
}
/**
* Make the LineJ3D into a {@link javax.media.j3d.Shape3D}.
*
* @param display the VisAD display for this Line.
*
* @return the LineJ3D description as a Shape3D object.
*/
public Object toDrawable(DisplayImpl display)
{
return ScreenAnnotatorUtils.makeLineShape3D(
(DisplayImplJ3D)display, style,
x1, y1, x2, y2, colour, zValue, thickness);
}
} // class LineJ3D