org.joml.Matrix3x2dc Maven / Gradle / Ivy
/*
* The MIT License
*
* Copyright (c) 2017-2019 JOML
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.joml;
import java.util.*;
/**
* Interface to a read-only view of a 3x2 matrix of double-precision floats.
*
* @author Kai Burjack
*/
public interface Matrix3x2dc {
/**
* Return the value of the matrix element at column 0 and row 0.
*
* @return the value of the matrix element
*/
double m00();
/**
* Return the value of the matrix element at column 0 and row 1.
*
* @return the value of the matrix element
*/
double m01();
/**
* Return the value of the matrix element at column 1 and row 0.
*
* @return the value of the matrix element
*/
double m10();
/**
* Return the value of the matrix element at column 1 and row 1.
*
* @return the value of the matrix element
*/
double m11();
/**
* Return the value of the matrix element at column 2 and row 0.
*
* @return the value of the matrix element
*/
double m20();
/**
* Return the value of the matrix element at column 2 and row 1.
*
* @return the value of the matrix element
*/
double m21();
/**
* Multiply this matrix by the supplied right
matrix by assuming a third row in
* both matrices of (0, 0, 1)
and store the result in dest
.
*
* If M
is this
matrix and R
the right
matrix,
* then the new matrix will be M * R
. So when transforming a
* vector v
with the new matrix by using M * R * v
, the
* transformation of the right matrix will be applied first!
*
* @param right
* the right operand of the matrix multiplication
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d mul(Matrix3x2dc right, Matrix3x2d dest);
/**
* Pre-multiply this matrix by the supplied left
matrix and store the result in dest
.
*
* If M
is this
matrix and L
the left
matrix,
* then the new matrix will be L * M
. So when transforming a
* vector v
with the new matrix by using L * M * v
, the
* transformation of this
matrix will be applied first!
*
* @param left
* the left operand of the matrix multiplication
* @param dest
* the destination matrix, which will hold the result
* @return dest
*/
Matrix3x2d mulLocal(Matrix3x2dc left, Matrix3x2d dest);
/**
* Return the determinant of this matrix.
*
* @return the determinant
*/
double determinant();
/**
* Invert the this
matrix by assuming a third row in this matrix of (0, 0, 1)
* and store the result in dest
.
*
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d invert(Matrix3x2d dest);
/**
* Apply a translation to this matrix by translating by the given number of units in x and y and store the result
* in dest
.
*
* If M
is this
matrix and T
the translation
* matrix, then the new matrix will be M * T
. So when
* transforming a vector v
with the new matrix by using
* M * T * v
, the translation will be applied first!
*
* @param x
* the offset to translate in x
* @param y
* the offset to translate in y
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d translate(double x, double y, Matrix3x2d dest);
/**
* Apply a translation to this matrix by translating by the given number of units in x and y, and
* store the result in dest
.
*
* If M
is this
matrix and T
the translation
* matrix, then the new matrix will be M * T
. So when
* transforming a vector v
with the new matrix by using
* M * T * v
, the translation will be applied first!
*
* @param offset
* the offset to translate
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d translate(Vector2dc offset, Matrix3x2d dest);
/**
* Pre-multiply a translation to this matrix by translating by the given number of
* units in x and y and store the result in dest
.
*
* If M
is this
matrix and T
the translation
* matrix, then the new matrix will be T * M
. So when
* transforming a vector v
with the new matrix by using
* T * M * v
, the translation will be applied last!
*
* @param offset
* the number of units in x and y by which to translate
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d translateLocal(Vector2dc offset, Matrix3x2d dest);
/**
* Pre-multiply a translation to this matrix by translating by the given number of
* units in x and y and store the result in dest
.
*
* If M
is this
matrix and T
the translation
* matrix, then the new matrix will be T * M
. So when
* transforming a vector v
with the new matrix by using
* T * M * v
, the translation will be applied last!
*
* @param x
* the offset to translate in x
* @param y
* the offset to translate in y
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d translateLocal(double x, double y, Matrix3x2d dest);
/**
* Get the current values of this
matrix and store them into
* dest
.
*
* @param dest
* the destination matrix
* @return dest
*/
Matrix3x2d get(Matrix3x2d dest);
/**
* Store this matrix in column-major order at the given off-heap address.
*
* This method will throw an {@link UnsupportedOperationException} when JOML is used with `-Djoml.nounsafe`.
*
* This method is unsafe as it can result in a crash of the JVM process when the specified address range does not belong to this process.
*
* @param address
* the off-heap address where to store this matrix
* @return this
*/
Matrix3x2dc getToAddress(long address);
/**
* Store this matrix into the supplied double array in column-major order at the given offset.
*
* @param arr
* the array to write the matrix values into
* @param offset
* the offset into the array
* @return the passed in array
*/
double[] get(double[] arr, int offset);
/**
* Store this matrix into the supplied double array in column-major order.
*
* In order to specify an explicit offset into the array, use the method {@link #get(double[], int)}.
*
* @see #get(double[], int)
*
* @param arr
* the array to write the matrix values into
* @return the passed in array
*/
double[] get(double[] arr);
/**
* Store this matrix as an equivalent 3x3 matrix into the supplied double array in column-major order at the given offset.
*
* @param arr
* the array to write the matrix values into
* @param offset
* the offset into the array
* @return the passed in array
*/
double[] get3x3(double[] arr, int offset);
/**
* Store this matrix as an equivalent 3x3 matrix into the supplied double array in column-major order.
*
* In order to specify an explicit offset into the array, use the method {@link #get3x3(double[], int)}.
*
* @see #get3x3(double[], int)
*
* @param arr
* the array to write the matrix values into
* @return the passed in array
*/
double[] get3x3(double[] arr);
/**
* Store this matrix as an equivalent 4x4 matrix into the supplied double array in column-major order at the given offset.
*
* @param arr
* the array to write the matrix values into
* @param offset
* the offset into the array
* @return the passed in array
*/
double[] get4x4(double[] arr, int offset);
/**
* Store this matrix as an equivalent 4x4 matrix into the supplied double array in column-major order.
*
* In order to specify an explicit offset into the array, use the method {@link #get4x4(double[], int)}.
*
* @see #get4x4(double[], int)
*
* @param arr
* the array to write the matrix values into
* @return the passed in array
*/
double[] get4x4(double[] arr);
/**
* Apply scaling to this matrix by scaling the unit axes by the given x and y and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
, the scaling will be applied first!
*
* @param x
* the factor of the x component
* @param y
* the factor of the y component
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scale(double x, double y, Matrix3x2d dest);
/**
* Apply scaling to this matrix by scaling the base axes by the given xy
factors
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
, the scaling will be applied first!
*
* @param xy
* the factors of the x and y component, respectively
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scale(Vector2dc xy, Matrix3x2d dest);
/**
* Apply scaling to this matrix by scaling the base axes by the given xy
factors
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
, the scaling will be applied first!
*
* @param xy
* the factors of the x and y component, respectively
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scale(Vector2fc xy, Matrix3x2d dest);
/**
* Pre-multiply scaling to this
matrix by scaling the two base axes by the given xy
factor,
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be S * M
. So when transforming a
* vector v
with the new matrix by using S * M * v
* , the scaling will be applied last!
*
* @param xy
* the factor to scale all two base axes by
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scaleLocal(double xy, Matrix3x2d dest);
/**
* Pre-multiply scaling to this
matrix by scaling the base axes by the given x and y
* factors and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be S * M
. So when transforming a
* vector v
with the new matrix by using S * M * v
* , the scaling will be applied last!
*
* @param x
* the factor of the x component
* @param y
* the factor of the y component
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scaleLocal(double x, double y, Matrix3x2d dest);
/**
* Pre-multiply scaling to this
matrix by scaling the base axes by the given sx and
* sy factors while using the given (ox, oy)
as the scaling origin,
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be S * M
. So when transforming a
* vector v
with the new matrix by using S * M * v
* , the scaling will be applied last!
*
* This method is equivalent to calling: new Matrix3x2d().translate(ox, oy).scale(sx, sy).translate(-ox, -oy).mul(this, dest)
*
* @param sx
* the scaling factor of the x component
* @param sy
* the scaling factor of the y component
* @param ox
* the x coordinate of the scaling origin
* @param oy
* the y coordinate of the scaling origin
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scaleAroundLocal(double sx, double sy, double ox, double oy, Matrix3x2d dest);
/**
* Pre-multiply scaling to this matrix by scaling the base axes by the given factor
* while using (ox, oy)
as the scaling origin,
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be S * M
. So when transforming a
* vector v
with the new matrix by using S * M * v
, the
* scaling will be applied last!
*
* This method is equivalent to calling: new Matrix3x2d().translate(ox, oy).scale(factor).translate(-ox, -oy).mul(this, dest)
*
* @param factor
* the scaling factor for all three axes
* @param ox
* the x coordinate of the scaling origin
* @param oy
* the y coordinate of the scaling origin
* @param dest
* will hold the result
* @return this
*/
Matrix3x2d scaleAroundLocal(double factor, double ox, double oy, Matrix3x2d dest);
/**
* Apply scaling to this matrix by uniformly scaling the two base axes by the given xy
factor
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
, the scaling will be applied first!
*
* @see #scale(double, double, Matrix3x2d)
*
* @param xy
* the factor for the two components
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scale(double xy, Matrix3x2d dest);
/**
* Apply scaling to this
matrix by scaling the base axes by the given sx and
* sy factors while using (ox, oy)
as the scaling origin, and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
* , the scaling will be applied first!
*
* This method is equivalent to calling: translate(ox, oy, dest).scale(sx, sy).translate(-ox, -oy)
*
* @param sx
* the scaling factor of the x component
* @param sy
* the scaling factor of the y component
* @param ox
* the x coordinate of the scaling origin
* @param oy
* the y coordinate of the scaling origin
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d scaleAround(double sx, double sy, double ox, double oy, Matrix3x2d dest);
/**
* Apply scaling to this matrix by scaling the base axes by the given factor
* while using (ox, oy)
as the scaling origin,
* and store the result in dest
.
*
* If M
is this
matrix and S
the scaling matrix,
* then the new matrix will be M * S
. So when transforming a
* vector v
with the new matrix by using M * S * v
, the
* scaling will be applied first!
*
* This method is equivalent to calling: translate(ox, oy, dest).scale(factor).translate(-ox, -oy)
*
* @param factor
* the scaling factor for all three axes
* @param ox
* the x coordinate of the scaling origin
* @param oy
* the y coordinate of the scaling origin
* @param dest
* will hold the result
* @return this
*/
Matrix3x2d scaleAround(double factor, double ox, double oy, Matrix3x2d dest);
/**
* Transform/multiply the given vector by this matrix by assuming a third row in this matrix of (0, 0, 1)
* and store the result in that vector.
*
* @see Vector3d#mul(Matrix3x2dc)
*
* @param v
* the vector to transform and to hold the final result
* @return v
*/
Vector3d transform(Vector3d v);
/**
* Transform/multiply the given vector by this matrix and store the result in dest
.
*
* @see Vector3d#mul(Matrix3x2dc, Vector3d)
*
* @param v
* the vector to transform
* @param dest
* will contain the result
* @return dest
*/
Vector3d transform(Vector3dc v, Vector3d dest);
/**
* Transform/multiply the given vector (x, y, z)
by this matrix and store the result in dest
.
*
* @param x
* the x component of the vector to transform
* @param y
* the y component of the vector to transform
* @param z
* the z component of the vector to transform
* @param dest
* will contain the result
* @return dest
*/
Vector3d transform(double x, double y, double z, Vector3d dest);
/**
* Transform/multiply the given 2D-vector, as if it was a 3D-vector with z=1, by
* this matrix and store the result in that vector.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 1.0, so it
* will represent a position/location in 2D-space rather than a direction.
*
* In order to store the result in another vector, use {@link #transformPosition(Vector2dc, Vector2d)}.
*
* @see #transformPosition(Vector2dc, Vector2d)
* @see #transform(Vector3d)
*
* @param v
* the vector to transform and to hold the final result
* @return v
*/
Vector2d transformPosition(Vector2d v);
/**
* Transform/multiply the given 2D-vector, as if it was a 3D-vector with z=1, by
* this matrix and store the result in dest
.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 1.0, so it
* will represent a position/location in 2D-space rather than a direction.
*
* In order to store the result in the same vector, use {@link #transformPosition(Vector2d)}.
*
* @see #transformPosition(Vector2d)
* @see #transform(Vector3dc, Vector3d)
*
* @param v
* the vector to transform
* @param dest
* will hold the result
* @return dest
*/
Vector2d transformPosition(Vector2dc v, Vector2d dest);
/**
* Transform/multiply the given 2D-vector (x, y)
, as if it was a 3D-vector with z=1, by
* this matrix and store the result in dest
.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 1.0, so it
* will represent a position/location in 2D-space rather than a direction.
*
* In order to store the result in the same vector, use {@link #transformPosition(Vector2d)}.
*
* @see #transformPosition(Vector2d)
* @see #transform(Vector3dc, Vector3d)
*
* @param x
* the x component of the vector to transform
* @param y
* the y component of the vector to transform
* @param dest
* will hold the result
* @return dest
*/
Vector2d transformPosition(double x, double y, Vector2d dest);
/**
* Transform/multiply the given 2D-vector, as if it was a 3D-vector with z=0, by
* this matrix and store the result in that vector.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 0.0
, so it
* will represent a direction in 2D-space rather than a position. This method will therefore
* not take the translation part of the matrix into account.
*
* In order to store the result in another vector, use {@link #transformDirection(Vector2dc, Vector2d)}.
*
* @see #transformDirection(Vector2dc, Vector2d)
*
* @param v
* the vector to transform and to hold the final result
* @return v
*/
Vector2d transformDirection(Vector2d v);
/**
* Transform/multiply the given 2D-vector, as if it was a 3D-vector with z=0, by
* this matrix and store the result in dest
.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 0.0
, so it
* will represent a direction in 2D-space rather than a position. This method will therefore
* not take the translation part of the matrix into account.
*
* In order to store the result in the same vector, use {@link #transformDirection(Vector2d)}.
*
* @see #transformDirection(Vector2d)
*
* @param v
* the vector to transform and to hold the final result
* @param dest
* will hold the result
* @return dest
*/
Vector2d transformDirection(Vector2dc v, Vector2d dest);
/**
* Transform/multiply the given 2D-vector (x, y)
, as if it was a 3D-vector with z=0, by
* this matrix and store the result in dest
.
*
* The given 2D-vector is treated as a 3D-vector with its z-component being 0.0
, so it
* will represent a direction in 2D-space rather than a position. This method will therefore
* not take the translation part of the matrix into account.
*
* In order to store the result in the same vector, use {@link #transformDirection(Vector2d)}.
*
* @see #transformDirection(Vector2d)
*
* @param x
* the x component of the vector to transform
* @param y
* the y component of the vector to transform
* @param dest
* will hold the result
* @return dest
*/
Vector2d transformDirection(double x, double y, Vector2d dest);
/**
* Apply a rotation transformation to this matrix by rotating the given amount of radians and store the result in dest
.
*
* If M
is this
matrix and R
the rotation matrix,
* then the new matrix will be M * R
. So when transforming a
* vector v
with the new matrix by using M * R * v
, the rotation will be applied first!
*
* @param ang
* the angle in radians
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d rotate(double ang, Matrix3x2d dest);
/**
* Pre-multiply a rotation to this matrix by rotating the given amount of radians and store the result in dest
.
*
* If M
is this
matrix and R
the rotation matrix,
* then the new matrix will be R * M
. So when transforming a
* vector v
with the new matrix by using R * M * v
, the
* rotation will be applied last!
*
* Reference: http://en.wikipedia.org
*
* @param ang
* the angle in radians
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d rotateLocal(double ang, Matrix3x2d dest);
/**
* Apply a rotation transformation to this matrix by rotating the given amount of radians about
* the specified rotation center (x, y)
and store the result in dest
.
*
* This method is equivalent to calling: translate(x, y, dest).rotate(ang).translate(-x, -y)
*
* If M
is this
matrix and R
the rotation matrix,
* then the new matrix will be M * R
. So when transforming a
* vector v
with the new matrix by using M * R * v
, the rotation will be applied first!
*
* @see #translate(double, double, Matrix3x2d)
* @see #rotate(double, Matrix3x2d)
*
* @param ang
* the angle in radians
* @param x
* the x component of the rotation center
* @param y
* the y component of the rotation center
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d rotateAbout(double ang, double x, double y, Matrix3x2d dest);
/**
* Apply a rotation transformation to this matrix that rotates the given normalized fromDir
direction vector
* to point along the normalized toDir
, and store the result in dest
.
*
* If M
is this
matrix and R
the rotation matrix,
* then the new matrix will be M * R
. So when transforming a
* vector v
with the new matrix by using M * R * v
, the rotation will be applied first!
*
* @param fromDir
* the normalized direction which should be rotate to point along toDir
* @param toDir
* the normalized destination direction
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d rotateTo(Vector2dc fromDir, Vector2dc toDir, Matrix3x2d dest);
/**
* Apply a "view" transformation to this matrix that maps the given (left, bottom)
and
* (right, top)
corners to (-1, -1)
and (1, 1)
respectively and store the result in dest
.
*
* If M
is this
matrix and O
the orthographic projection matrix,
* then the new matrix will be M * O
. So when transforming a
* vector v
with the new matrix by using M * O * v
, the
* orthographic projection transformation will be applied first!
*
* @param left
* the distance from the center to the left view edge
* @param right
* the distance from the center to the right view edge
* @param bottom
* the distance from the center to the bottom view edge
* @param top
* the distance from the center to the top view edge
* @param dest
* will hold the result
* @return dest
*/
Matrix3x2d view(double left, double right, double bottom, double top, Matrix3x2d dest);
/**
* Obtain the position that gets transformed to the origin by this
matrix.
* This can be used to get the position of the "camera" from a given view transformation matrix.
*
* This method is equivalent to the following code:
*
* Matrix3x2d inv = new Matrix3x2d(this).invertAffine();
* inv.transform(origin.set(0, 0));
*
*
* @param origin
* will hold the position transformed to the origin
* @return origin
*/
Vector2d origin(Vector2d origin);
/**
* Obtain the extents of the view transformation of this
matrix and store it in area
.
* This can be used to determine which region of the screen (i.e. the NDC space) is covered by the view.
*
* @param area
* will hold the view area as [minX, minY, maxX, maxY]
* @return area
*/
double[] viewArea(double[] area);
/**
* Obtain the direction of +X
before the transformation represented by this
matrix is applied.
*
* This method uses the rotation component of the left 2x2 submatrix to obtain the direction
* that is transformed to +X
by this
matrix.
*
* This method is equivalent to the following code:
*
* Matrix3x2d inv = new Matrix3x2d(this).invert();
* inv.transformDirection(dir.set(1, 0)).normalize();
*
* If this
is already an orthogonal matrix, then consider using {@link #normalizedPositiveX(Vector2d)} instead.
*
* Reference: http://www.euclideanspace.com
*
* @param dir
* will hold the direction of +X
* @return dir
*/
Vector2d positiveX(Vector2d dir);
/**
* Obtain the direction of +X
before the transformation represented by this
orthogonal matrix is applied.
* This method only produces correct results if this
is an orthogonal matrix.
*
* This method uses the rotation component of the left 2x2 submatrix to obtain the direction
* that is transformed to +X
by this
matrix.
*
* This method is equivalent to the following code:
*
* Matrix3x2d inv = new Matrix3x2d(this).transpose();
* inv.transformDirection(dir.set(1, 0));
*
*
* Reference: http://www.euclideanspace.com
*
* @param dir
* will hold the direction of +X
* @return dir
*/
Vector2d normalizedPositiveX(Vector2d dir);
/**
* Obtain the direction of +Y
before the transformation represented by this
matrix is applied.
*
* This method uses the rotation component of the left 2x2 submatrix to obtain the direction
* that is transformed to +Y
by this
matrix.
*
* This method is equivalent to the following code:
*
* Matrix3x2d inv = new Matrix3x2d(this).invert();
* inv.transformDirection(dir.set(0, 1)).normalize();
*
* If this
is already an orthogonal matrix, then consider using {@link #normalizedPositiveY(Vector2d)} instead.
*
* Reference: http://www.euclideanspace.com
*
* @param dir
* will hold the direction of +Y
* @return dir
*/
Vector2d positiveY(Vector2d dir);
/**
* Obtain the direction of +Y
before the transformation represented by this
orthogonal matrix is applied.
* This method only produces correct results if this
is an orthogonal matrix.
*
* This method uses the rotation component of the left 2x2 submatrix to obtain the direction
* that is transformed to +Y
by this
matrix.
*
* This method is equivalent to the following code:
*
* Matrix3x2d inv = new Matrix3x2d(this).transpose();
* inv.transformDirection(dir.set(0, 1));
*
*
* Reference: http://www.euclideanspace.com
*
* @param dir
* will hold the direction of +Y
* @return dir
*/
Vector2d normalizedPositiveY(Vector2d dir);
/**
* Unproject the given window coordinates (winX, winY)
by this
matrix using the specified viewport.
*
* This method first converts the given window coordinates to normalized device coordinates in the range [-1..1]
* and then transforms those NDC coordinates by the inverse of this
matrix.
*
* As a necessary computation step for unprojecting, this method computes the inverse of this
matrix.
* In order to avoid computing the matrix inverse with every invocation, the inverse of this
matrix can be built
* once outside using {@link #invert(Matrix3x2d)} and then the method {@link #unprojectInv(double, double, int[], Vector2d) unprojectInv()} can be invoked on it.
*
* @see #unprojectInv(double, double, int[], Vector2d)
* @see #invert(Matrix3x2d)
*
* @param winX
* the x-coordinate in window coordinates (pixels)
* @param winY
* the y-coordinate in window coordinates (pixels)
* @param viewport
* the viewport described by [x, y, width, height]
* @param dest
* will hold the unprojected position
* @return dest
*/
Vector2d unproject(double winX, double winY, int[] viewport, Vector2d dest);
/**
* Unproject the given window coordinates (winX, winY)
by this
matrix using the specified viewport.
*
* This method differs from {@link #unproject(double, double, int[], Vector2d) unproject()}
* in that it assumes that this
is already the inverse matrix of the original projection matrix.
* It exists to avoid recomputing the matrix inverse with every invocation.
*
* @see #unproject(double, double, int[], Vector2d)
*
* @param winX
* the x-coordinate in window coordinates (pixels)
* @param winY
* the y-coordinate in window coordinates (pixels)
* @param viewport
* the viewport described by [x, y, width, height]
* @param dest
* will hold the unprojected position
* @return dest
*/
Vector2d unprojectInv(double winX, double winY, int[] viewport, Vector2d dest);
/**
* Test whether the given point (x, y)
is within the frustum defined by this
matrix.
*
* This method assumes this
matrix to be a transformation from any arbitrary coordinate system/space M
* into standard OpenGL clip space and tests whether the given point with the coordinates (x, y, z)
given
* in space M
is within the clip space.
*
* Reference:
* Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
*
* @param x
* the x-coordinate of the point
* @param y
* the y-coordinate of the point
* @return true
if the given point is inside the frustum; false
otherwise
*/
boolean testPoint(double x, double y);
/**
* Test whether the given circle is partly or completely within or outside of the frustum defined by this
matrix.
*
* This method assumes this
matrix to be a transformation from any arbitrary coordinate system/space M
* into standard OpenGL clip space and tests whether the given sphere with the coordinates (x, y, z)
given
* in space M
is within the clip space.
*
* Reference:
* Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
*
* @param x
* the x-coordinate of the circle's center
* @param y
* the y-coordinate of the circle's center
* @param r
* the circle's radius
* @return true
if the given circle is partly or completely inside the frustum; false
otherwise
*/
boolean testCircle(double x, double y, double r);
/**
* Test whether the given axis-aligned rectangle is partly or completely within or outside of the frustum defined by this
matrix.
* The rectangle is specified via its min and max corner coordinates.
*
* This method assumes this
matrix to be a transformation from any arbitrary coordinate system/space M
* into standard OpenGL clip space and tests whether the given axis-aligned rectangle with its minimum corner coordinates (minX, minY, minZ)
* and maximum corner coordinates (maxX, maxY, maxZ)
given in space M
is within the clip space.
*
* Reference: Efficient View Frustum Culling
*
* Reference:
* Fast Extraction of Viewing Frustum Planes from the World-View-Projection Matrix
*
* @param minX
* the x-coordinate of the minimum corner
* @param minY
* the y-coordinate of the minimum corner
* @param maxX
* the x-coordinate of the maximum corner
* @param maxY
* the y-coordinate of the maximum corner
* @return true
if the axis-aligned box is completely or partly inside of the frustum; false
otherwise
*/
boolean testAar(double minX, double minY, double maxX, double maxY);
/**
* Compare the matrix elements of this
matrix with the given matrix using the given delta
* and return whether all of them are equal within a maximum difference of delta
.
*
* Please note that this method is not used by any data structure such as {@link ArrayList} {@link HashSet} or {@link HashMap}
* and their operations, such as {@link ArrayList#contains(Object)} or {@link HashSet#remove(Object)}, since those
* data structures only use the {@link Object#equals(Object)} and {@link Object#hashCode()} methods.
*
* @param m
* the other matrix
* @param delta
* the allowed maximum difference
* @return true
whether all of the matrix elements are equal; false
otherwise
*/
boolean equals(Matrix3x2dc m, double delta);
}