What is this library?
CGL vectors library is a built-in library of CGL that you can use & utilize for your projects. It performs most of the basic vector & matrix mathematics, and is heavily used in our reference solution.
Why you should use it?
The vectors library contains fully overloaded operators (so you can write vector equations just like normal ones), and it contains a lot of optimizations. These features reduces code size and risk of getting something wrong in the equation. This usually also improves the performance.
References
Data Types
Vector Types
Vector2D
Vector3D
Spectrum
is an alias ofVector3D
, as RGB vectors are still three-component vectors
Vector4D
Matrix Types
Matrix3x3
Matrix4x4
Constructor
Vector2D()
/ Vector3D()
/ Vector4D()
Creates a 2D/3D/4D zero vector.
Vector2D(x)
/ Vector3D(x)
/ Vector4D(x)
Creates a 2D/3D/4D vector containing x
: {x, x} / {x, x, x} / {x, x, x, x}
Vector2D(x,y)
/ Vector3D(x,y,z)
/ Vector4D(x,y,z,w)
Creates a 2D/3D/4D vector: {x, y} / {x, y, z} / {x, y, z, w}
Operations
Vector Indexing
Vector2D v;
x = v.x = v[0]
y = v.y = v[1]
For 3D vectors, as colors and spectrums can also be represented, you can also index 3D vectors / spectrums using r
, g
, and b
Vector3D v;
x = v.x = v[0] = r = v.r
y = v.y = v[1] = g = v.g
z = v.z = v[2] = b = v.b
For 4D vectors, as colors with transparency also be represented, you can also index 4D vectors / spectrums using r
, g
, b
, and a
Vector4D v;
x = v.x = v[0] = r = v.r
y = v.y = v[1] = g = v.g
z = v.z = v[2] = b = v.b
w = v.w = v[3] = a = v.a
Matrix Indexing
MatrixND m
m[n]
is the n-th column of m
, in a form of a VectorND
m[n].x
is the n-th column first row of m
m[n][i]
is the n-th column i-th row of m
Vector-Scalar Operations
Assume v
is a vector, s
is a scalar:
VectorND v;
double s;
Vector-scalar multiplication / division
v * s
Returns {v.x * s, v.y * s, v.z * s}
s * v
Returns {v.x * s, v.y * s, v.z * s}
v / s
Returns {v.x / s, v.y / s, v.z / s}
s / v
Returns {s / v.x, s / v.y, s / v.z}
Vector-Vector Operations
Assume v1
and v2
are vectors of the same size.
Vector-vector division (element-wise division)
v1 / v2
returns {v1.x / v2.x, v1.y / v2.y, v1.z / v2.z}
Vector-vector addition (element-wise addition)
v1 + v2
returns {v1.x + v2.x, v1.y + v2.y, v1.z + v2.z}
Vector-vector subtraction (element-wise subtraction)
v1 - v2
returns {v1.x - v2.x, v1.y - v2.y, v1.z - v2.z}
Dot product
dot(v1, v2)
returns dot product v1.x * v2.x + v1.y * v2.y + v1.z * v2.z
Cross product
cross(v1, v2)
returns the cross product of v1
and v2
Outer product
outer(v1, v2)
retruns a MatrixNxN
, the outer product of v1
and v2
Vector Methods
v.rcp()
returns per-entry reciprocal {1.0 / v.x, 1.0 / v.y, 1.0 / v.z}
v.norm()
returns euclidean length sqrt(v.x * v.x + v.y * v.y + v.z * v.z)
v.norm2()
returns square of euclidean length v.x * v.x + v.y * v.y + v.z * v.z
v.unit()
returns normalized unit vector {v.x / v.norm(), v.y / v.norm(), v.z / v.norm()}
v.normalize()
normalizes the vector to unit vector. (does not return anything)
For 3D vectors:
v.illum()
returns the perceived brightness of a spectrum (color) vector
v.toColor()
returns a Color
object from the spectrum object.
Vector3D::fromColor(c)
returns a Vector3D
object construted from Color
object c
.
Matrix-Matrix Operations
Assume A1
and A2
are MatrixNxN
A1 - A2
returns element-wise subtraction
A1 + A2
returns element-wise addition
A1 * A2
returns matrix-matrix multiplication
Matrix-Vector Operations
Assume A
is MatrixNxN
and v
is VectorND
A*v
returns matrix-vector multiplication. Returns a VectorND
Matrix-Scalar Operations
Assume A
is MatrixNxN
and s
is scalar
A * s
or s * A
returns {A[0] * s, A[1] * s, A[2] * s}
Matrix Methods
A.det()
retruns determinant of A
(double)
A.norm()
returns Frobenius norm of A
A.inv()
returns the inverse of A
Printing Vectors
You can use std::cout << v << std::endl
to print vectors directly.
You may see it printed out as a color with R,G,B channels, as color is just like any other three-component vector. The R/G/B channels correspond to X/Y/Z axes
Printing Matrices
You can use std::cout << A << std::endl
to print matrices directly.