Class CubeSurface
- All Implemented Interfaces:
Surface
Part of the surface definition involves a rotation matrix by which the data positions are rotated before being plotted to the screen. If the rotation matrix is a unit matrix, the data X coord is screen X increasing left to right (graphics positive), the data Z coord is screen Y increasing bottom to top (graphics negative), and the data Y coord is into the screen increasing front to back.
- Since:
- 20 Feb 2013
- Author:
- Mark Taylor
-
Constructor Summary
ConstructorsConstructorDescriptionCubeSurface(int gxlo, int gxhi, int gylo, int gyhi, double[] dlos, double[] dhis, Scale[] scales, boolean[] flipFlags, double[] rotmat, double zoom, double xoff, double yoff, Tick[][] ticks, Orientation[] orients, String[] labels, Captioner captioner, boolean frame, boolean antialias) Constructor. -
Method Summary
Modifier and TypeMethodDescriptionstatic CubeSurfacecreateSurface(Rectangle plotBounds, CubeAspect aspect, boolean forceIso, Scale[] scales, boolean[] flipFlags, String[] labels, double[] crowdFactors, OrientationPolicy orientpolicy, Captioner captioner, boolean frame, boolean minor, boolean antialias) Utility method to create a CubeSurface from available requirements.booleandataToGraphics(double[] dataPos, boolean visibleOnly, Point2D.Double gPos) Converts a data space position to a graphics position.booleandataToGraphicsOffset(double[] dataPos0, Point2D.Double gPos0, double[] dataPos1, boolean visibleOnly, Point2D.Double gpos1) Converts an offset data space position to a graphics position.booleandataToGraphicZ(double[] dataPos, boolean visibleOnly, GPoint3D gPos) Returns graphics position plus Z coordinate for a data point.booleanformatPosition(double[] dataPos) Returns null.Returns a captioner suitable for drawing general purpose labels annotating the plot.intReturns 3.double[]getDataLimits(int idim) Returns the data range boundaries in a specified dimension.boolean[]Indicates which axes are reversed.Returns the rectangle within which all of the plot data will appear.Scale[]Indicates the scaling along the three axes.int[]Identifies which data space axes are closest to the screen horizontal, vertical and normal directions in the current state of rotation.getSurround(boolean withScroll) Returns the surround that this surface would like to reserve outside the plot bounds.double[]graphicsToData(Point2D gpos0, Supplier<CoordSequence> dposSupplier) Only works if a point iterator is supplied, because of degeneracy in mapping a cube to a plane.inthashCode()booleaninRange(double[] dataPos) Determines whether a given data position is within the data space cube represented by this surface.booleanisContinuousLine(double[] dpos0, double[] dpos1) Indicates whether a line in graphics space between two given data space positions is continuous.static booleanisIsometricPossible(Scale[] scales) Determines whether forced isometric scaling makes sense for a given set of axis scales.doublenormalise(double[] dataPos, int idim) Maps a data space coordinate to a normalised space coordinate.voidnormalisedToGraphicZ(double sx, double sy, double sz, GPoint3D gPos) Converts normalised 3d coordinates to a graphics position plus Z coordinate.voidPaints the plot surface background.voidPaints the plot surface foreground.projectNormalisedPos(double[] nPos) Determines the graphics position to which a normalised space point will map.
-
Constructor Details
-
CubeSurface
public CubeSurface(int gxlo, int gxhi, int gylo, int gyhi, double[] dlos, double[] dhis, Scale[] scales, boolean[] flipFlags, double[] rotmat, double zoom, double xoff, double yoff, Tick[][] ticks, Orientation[] orients, String[] labels, Captioner captioner, boolean frame, boolean antialias) Constructor.- Parameters:
gxlo- graphics X coordinate lower boundgxhi- graphics X coordinate upper boundgylo- graphics Y coordinate lower boundgyhi- graphics Y coordinate upper bounddlos- 3-element array giving X,Y,Z data coordinate lower boundsdhis- 3-element array giving X,Y,Z data coordinate upper boundsscales- 3-element array giving scaling on X,Y,Z axisflipFlags- 3-element array flagging axis inversion for X,Y,Zrotmat- 9-element array giving graphics space rotation matrixzoom- zoom factor, 1 means cube roughly fills plot boundsxoff- graphics X offset in pixels, 0 means centred in plot boundsyoff- graphics Y offset in pixels, 0 means centred in plot boundsticks- 3-element array X,Y,Z tickmark arraysorients- 3-element array X,Y,Z tick caption orientationslabels- 3-element array of X,Y,Z axis label stringscaptioner- text rendererframe- whether to draw wire frameantialias- whether to antialias grid lines
-
-
Method Details
-
getDataDimCount
public int getDataDimCount()Returns 3.- Specified by:
getDataDimCountin interfaceSurface- Returns:
- number of elements in data space coordinate array
-
getPlotBounds
Description copied from interface:SurfaceReturns the rectangle within which all of the plot data will appear. This includes anything that might get drawn by a plot layer, but does not necessarily include axis labels etc.- Specified by:
getPlotBoundsin interfaceSurface- Returns:
- plot data area bounds
-
getSurround
Description copied from interface:SurfaceReturns the surround that this surface would like to reserve outside the plot bounds. This is space outside the rectangle returned bySurface.getPlotBounds()to be used for axis labels etc.If the
withScrollparameter is set, then an attempt will be made to return a surround that will not alter if the current plot is scrolled around a moderate amount. For a one-time plot that's not important, but for an interactive plot it prevents the actual plot position jumping around to accommodate more or less space on the axes according to exactly where ticks happen to fall on the axes.This method is supposed to return only the space that may actually be touched by the plot. The calling code may wish to apply additional padding on top of this for cosmetic reasons.
- Specified by:
getSurroundin interfaceSurface- Parameters:
withScroll- true to reserve space for nicer scrolling- Returns:
- plot data area surround
-
getCaptioner
Description copied from interface:SurfaceReturns a captioner suitable for drawing general purpose labels annotating the plot.- Specified by:
getCaptionerin interfaceSurface- Returns:
- captioner
-
dataToGraphics
Description copied from interface:SurfaceConverts a data space position to a graphics position. IfvisibleOnlyis true, then if the return value is true, the exit value ofgPosis guaranteed to be within the plot bounds of this surface.If
visibleOnlyis false, there are no guarantees about the exit value ofgPos, and its coordinates could be infinite or NaN. In this case you might want to perform additional checking, for instance with the utility methodsPlotUtil.isPointFiniteorisPointReal.- Specified by:
dataToGraphicsin interfaceSurface- Parameters:
dataPos- dataDimCount-element array containing data space coordinatesvisibleOnly- if true, then the conversion will only succeed when the result falls within the plot bounds of this surfacegPos- point object into which the graphics position will be written on success- Returns:
- true iff the conversion succeeds
-
dataToGraphicsOffset
public boolean dataToGraphicsOffset(double[] dataPos0, Point2D.Double gPos0, double[] dataPos1, boolean visibleOnly, Point2D.Double gpos1) Description copied from interface:SurfaceConverts an offset data space position to a graphics position. Context is given in the form of an existing converted nearby point (both data and graphics positions).This (somewhat hacky) method is required for surfaces in which a data position may map to more than one position in graphics space, for instance sky surfaces with discontinuous longitude. The result does not need to be the same as the result of calling
Surface.dataToGraphics(double[], boolean, Point2D.Double), and is not required to be a legal graphics position, but it must make visual sense, for instance when plotting error bars. The semantics of a "nearby point" is not very well defined. There are probably situations in which calling this will not give the result that's wanted, but they will probably be rare.- Specified by:
dataToGraphicsOffsetin interfaceSurface- Parameters:
dataPos0- context position in data spacegPos0- context position in graphics space (result of calling dataToGraphics on dpos0)dataPos1- query position in data spacevisibleOnly- if true, the call only succeeds if the result is within the plot bounds of this surfacegpos1- point object to which the graphics position of dpos1 will be written on success- Returns:
- true for success, false for no result
-
dataToGraphicZ
Returns graphics position plus Z coordinate for a data point.- Parameters:
dataPos- 3-element X,Y,Z position in data coordinatesvisibleOnly- true if only data points that will be visible on this surface are of interestgPos- the 3-d graphics position will be written into this point on success- Returns:
- true iff the conversion was successful
- See Also:
-
normalisedToGraphicZ
Converts normalised 3d coordinates to a graphics position plus Z coordinate. The normalised positions are as returned bynormalise. If coordinates outside of the normalised range (-1,1) are submitted, the output position will be outside the visible cube.- Parameters:
sx- normalised X coordinatesy- normalised Y coordinatesz- normalised Z coordinategPos- the graphics position will be written into this point
-
inRange
public boolean inRange(double[] dataPos) Determines whether a given data position is within the data space cube represented by this surface.- Parameters:
dataPos- 3-element array of non-normalised data coordinates- Returns:
- true if it falls within this surface's data bounds
-
getDataLimits
public double[] getDataLimits(int idim) Returns the data range boundaries in a specified dimension.- Parameters:
idim- dimension index (0..2)- Returns:
- 2-element array giving (lower,upper) limits in data coords in the specified dimension
-
getScales
Indicates the scaling along the three axes.- Returns:
- 3-element array giving scaling on X, Y, Z axes
-
getFlipFlags
public boolean[] getFlipFlags()Indicates which axes are reversed.- Returns:
- 3-element array giving X, Y, Z flip flags; true to invert normal plot direction
-
normalise
public double normalise(double[] dataPos, int idim) Maps a data space coordinate to a normalised space coordinate. Normalised coordinates are in the range -1..+1.- Parameters:
dataPos- 3-element data space coordinate arrayidim- index of dimension to convert (0, 1 or 2)- Returns:
- normalised coordinate
-
projectNormalisedPos
Determines the graphics position to which a normalised space point will map. This method is not maximally fast (it creates a Point object) so should not be used in a tight loop.- Parameters:
nPos- 3-element coordinate array in normalised space- Returns:
- graphics position
-
formatPosition
Returns null. At time of writing this method is not called for CubeSurface.- Specified by:
formatPositionin interfaceSurface- Parameters:
dataPos- dataDimCount-element array giving data space position- Returns:
- human-readable string representing position
-
graphicsToData
Only works if a point iterator is supplied, because of degeneracy in mapping a cube to a plane. If we have a point iterator, then the Z coordinate is determined as the average Z coordinate of all data points that fall near to the indicated graphics position.- Specified by:
graphicsToDatain interfaceSurface- Parameters:
gpos0- graphics pointdposSupplier- iterable over dataDimCount-element arrays representing all the data space positions plotted, or null- Returns:
- dataDimCount-element array giving data space position for
gPos, or null if it cannot be determined
-
isContinuousLine
public boolean isContinuousLine(double[] dpos0, double[] dpos1) Description copied from interface:SurfaceIndicates whether a line in graphics space between two given data space positions is continuous.This is not very well-defined, but if drawing a line in graphics coordinates between the graphics coordinates corresponding to the two data coordinates is likely to do something badly wrong, this method should return false. It is intended to deal with the case where a short offset in data coordinates would lead to a line going the wrong way round the sky when it crosses the longitude=+/-PI boundary in an Aitoff projection.
- Specified by:
isContinuousLinein interfaceSurface- Parameters:
dpos0- first dataDimCount-element array containing data space coordinatesdpos1- second dataDimCount-element array containing data space coordinates- Returns:
- true if drawing a graphics line between the two positions should be OK
-
paintBackground
Description copied from interface:SurfacePaints the plot surface background. Anything that appears within the plot bounds underneath the data markings must go here.- Specified by:
paintBackgroundin interfaceSurface- Parameters:
g- graphics context
-
paintForeground
Description copied from interface:SurfacePaints the plot surface foreground. Anything that appears on top of the data markings or outside the plot bounds must go here. This may include axes.- Specified by:
paintForegroundin interfaceSurface- Parameters:
g- graphics context
-
getScreenDirections
public int[] getScreenDirections()Identifies which data space axes are closest to the screen horizontal, vertical and normal directions in the current state of rotation.- Returns:
- 3-element array, a permutation of the values 0,1,2; elements are indices of screen {horizontal, vertical, normal} axes respectively
-
equals
-
hashCode
-
createSurface
public static CubeSurface createSurface(Rectangle plotBounds, CubeAspect aspect, boolean forceIso, Scale[] scales, boolean[] flipFlags, String[] labels, double[] crowdFactors, OrientationPolicy orientpolicy, Captioner captioner, boolean frame, boolean minor, boolean antialias) Utility method to create a CubeSurface from available requirements. It works out the tickmarks and then invokes the constructor.- Parameters:
plotBounds- rectangle within which the plot should be drawnaspect- surface view configurationforceIso- if true, scaling is forced the same on all axesscales- 3-element array giving axis scaling on X,Y,Z axisflipFlags- 3-element array flagging axis inversion for X,Y,Zlabels- 3-element array of X,Y,Z axis label stringscrowdFactors- 3-element array giving tick mark crowding factors for X,Y,Z axes; 1 is normalorientpolicy- axis label orientation policycaptioner- text rendererframe- whether to draw wire frameminor- whether to draw minor tickmarksantialias- whether to antialias grid lines- Returns:
- new plot surface
-
isIsometricPossible
Determines whether forced isometric scaling makes sense for a given set of axis scales.- Parameters:
scales- 3-element array giving scaling for X, Y, Z axes- Returns:
- true iff forced isometric scaling is a possibility
-