Defines a range of two-dimensional grid coverage coordinates. This implementation extends
Rectangle for interoperability with Java2D. Note that at the opposite of
GeneralGridEnvelope, this class is mutable.

CAUTION:
ISO 19123 defines high coordinates as inclusive.
We follow this specification for all getters methods, but keep in mind that this is the
opposite of Java2D usage where Rectangle maximal values are exclusive.

GridEnvelope2D

Casts the specified envelope into a grid envelope. This is sometime useful after an
envelope has been transformed from "real world" coordinates to grid coordinates using the
grid to CRS transform.
The floating point values are rounded toward the nearest integers.

Notice that highest values are interpreted as non-inclusive

Anchor
According OpenGIS specification, grid
geometry maps pixel's center. But envelopes typically encompass all pixels. This means
that grid coordinates (0,0) has an envelope starting at (-0.5, -0.5). In order to revert
back such envelope to a grid envelope, it is necessary to add 0.5 to every coordinates
(including the maximum value since it is exclusive in a grid envelope). This offset is
applied only if anchor is PixelInCell.CELL_CENTER. Users who don't want
such offset should specify PixelInCell.CELL_CORNER.

The convention is specified as a PixelInCell code instead than the more detailed
PixelOrientation because the latter is restricted to
the two-dimensional case while the former can be used for any number of dimensions.

Parameters:

envelope - The envelope to use for initializing this grid envelope.

anchor - Whatever envelope coordinates map to pixel center or pixel corner. Should be
PixelInCell.CELL_CENTER for OGC convention (an offset of 0.5 will be
added to every envelope coordinate values), or PixelInCell.CELL_CORNER
for Java2D/JAI convention (no offset will be added).

GridEnvelope2D

Casts the specified envelope into a grid envelope. This is sometime useful after an
envelope has been transformed from "real world" coordinates to grid coordinates using the
grid to CRS transform.
The floating point values are rounded toward the nearest integers.

Note about rounding mode
It would have been possible to round the minimal value
toward floor and the maximal value
toward ceil in order to make sure that the grid envelope encompass
fully the envelope - like what Java2D does when converting Rectangle2D
to Rectangle). But this approach may increase by 1 or 2 units the image
width or height. For
example the range [-0.25 ... 99.75] (which is exactly 101 units wide) would be casted
to [-1 ... 100], which is 102 units wide. This leads to unexpected results when using
grid envelope with image operations like "Affine". For avoiding such changes in size, it is necessary to use the same rounding mode
for both minimal and maximal values. The selected rounding mode is nearest integer in this implementation.

Anchor
According OpenGIS specification, grid
geometry maps pixel's center. But envelopes typically encompass all pixels. This means
that grid coordinates (0,0) has an envelope starting at (-0.5, -0.5). In order to revert
back such envelope to a grid envelope, it is necessary to add 0.5 to every coordinates
(including the maximum value since it is exclusive in a grid envelope). This offset is
applied only if anchor is PixelInCell.CELL_CENTER. Users who don't want
such offset should specify PixelInCell.CELL_CORNER.

The convention is specified as a PixelInCell code instead than the more detailed
PixelOrientation because the latter is restricted to
the two-dimensional case while the former can be used for any number of dimensions.

Parameters:

envelope - The envelope to use for initializing this grid envelope.

anchor - Whatever envelope coordinates map to pixel center or pixel corner. Should be
PixelInCell.CELL_CENTER for OGC convention (an offset of 0.5 will be
added to every envelope coordinate values), or PixelInCell.CELL_CORNER
for Java2D/JAI convention (no offset will be added).

isHighIncluded - true if the envelope maximal values are inclusive, or false if
they are exclusive. This argument does not apply to minimal values, which are
always inclusive.