Struct Vector
Vector representation
struct Vector(T, int size)
;
Constructors
Name | Description |
---|---|
this
(v)
|
Vector constructor. Supports initializing from vector of arbitrary length and type |
this
(components)
|
Array constructor |
this
(components)
|
Static array constructor |
this
(components)
|
Tuple constructor |
this
(str)
|
String constructor |
Fields
Name | Type | Description |
---|---|---|
arrayof
|
T[size] | Vector components |
Properties
Name | Type | Description |
---|---|---|
elements [set]
|
string | Symbolic element access |
isZero [get]
|
bool | Return true if all components are zero |
length [get]
|
T | Get vector length |
lengthsqr [get]
|
T | Get vector length squared |
normalized [get]
|
Vector!(T,size) | Return normalized copy |
toString [get]
|
string | Convert to string |
Methods
Name | Description |
---|---|
clamp
(minv, maxv)
|
Clamp components to min/max value |
normalize
()
|
Set vector length to 1 |
opAssign
(v)
|
Vector!(T,size) = Vector!(T,size2) |
opAssign
(ev)
|
Vector!(T,size) = Vector!(T,size2) for enums |
opBinary
(v)
|
Vector!(T,size) + Vector!(T,size) |
opBinary
(v)
|
Vector!(T,size) - Vector!(T,size) |
opBinary
(v)
|
Vector!(T,size) * Vector!(T,size) |
opBinary
(v)
|
Vector!(T,size) / Vector!(T,size) |
opBinary
(t)
|
Vector!(T,size) + T |
opBinary
(t)
|
Vector!(T,size) - T |
opBinary
(t)
|
Vector!(T,size) * T |
opBinary
(t)
|
Vector!(T,size) / T |
opBinary
(t)
|
Vector!(T,size) % T |
opBinaryRight
(t)
|
T * Vector!(T,size) |
opIndex
(index)
|
T = Vector!(T,size)[index] |
opIndexAssign
(n, index)
|
Vector!(T,size)[index] = T |
opOpAssign
(v)
|
Vector!(T,size) += Vector!(T,size) |
opOpAssign
(v)
|
Vector!(T,size) -= Vector!(T,size) |
opOpAssign
(v)
|
Vector!(T,size) *= Vector!(T,size) |
opOpAssign
(v)
|
Vector!(T,size) /= Vector!(T,size) |
opOpAssign
(t)
|
Vector!(T,size) += T |
opOpAssign
(t)
|
Vector!(T,size) -= T |
opOpAssign
(t)
|
Vector!(T,size) *= T |
opOpAssign
(t)
|
Vector!(T,size) /= T |
opOpAssign
(t)
|
Vector!(T,size) %= T |
opSlice
(index1, index2)
|
T[] = Vector!(T,size)[index1..index2] |
opSlice
()
|
T = Vector!(T,size)[] |
opSliceAssign
(t, index1, index2)
|
Vector!(T,size)[index1..index2] = T |
opSliceAssign
(t)
|
Vector!(T,size)[] = T |
opUnary
()
|
-Vector!(T,size) |
opUnary
()
|
+Vector!(T,size) |
Templates
Name | Description |
---|---|
opDispatch
|
Swizzling |
Example
{
const vec3 a = vec3(10.5f, 20.0f, 33.12345f);
const vec3 b = -a;
const vec3 c = +a - b;
const vec3 d = a * b / c;
assert(isAlmostZero(to!vec3(c .toString()) - c));
const vec3 v = vec3(10, 10, 10);
const vec3 vRes = (v / 10) * 2 - 1 + 5;
assert(isAlmostZero(vRes - vec3(6, 6, 6)));
assert(!vRes .isZero);
ivec2 ab = ivec2(5, 15);
ab += ivec2(20, 30);
ab *= 3;
assert(ab[0] == 75 && ab[1] == 135);
auto len = c .length();
auto lensqr = c .lengthsqr();
auto dist = distance(a, b);
auto xy = a[0..1];
auto n = a[];
vec3 v1 = vec3(2.0f, 0.0f, 1.0f);
ivec3 v2 = v1;
assert(ivec3(v1) == ivec3(2, 0, 1));
vec3 v3 = [0, 2, 3.5];
assert(v3 == vec3(0.0f, 2.0f, 3.5f));
ivec3 v4 = [7, 8, 3];
v4 %= 2;
assert(v4 == ivec3(1, 0, 1));
}
{
Vector3f a = Vector3f(1, 2, 3);
Vector2f b = Vector2f(a);
assert(b == Vector2f(1, 2));
}
{
Vector3f a = Vector3f([0, 1]);
assert(isNaN(a .z));
}
{
Vector3f a = Vector3f(0, 1, 2);
a += 1;
assert(a == Vector3f(1, 2, 3));
a *= 2;
assert(a == Vector3f(2, 4, 6));
a -= 1;
assert(a == Vector3f(1, 3, 5));
a /= 3;
assert(a .y == 1);
}
{
Vector3f a;
a[1] = 3;
assert(a .y == 3);
a[0..3] = 1;
assert(a == Vector3f(1, 1, 1));
a[] = 0;
assert(a == Vector3f(0, 0, 0));
}
{
Vector3i a = Vector3i(0, 0, 3);
a = a .normalized;
assert(a == Vector3i(0, 0, 1));
assert(a .length == 1);
}
{
Vector3f a = Vector3f(0, 0, 0);
assert(a .isZero);
}
{
Vector3f a = Vector3f(2, -3, 0);
a .clamp(-1, 1);
assert(a == Vector3f(1, -1, 0));
}
{
Vector3f a = Vector3f(2, 5, 7);
Vector4f b = Vector4f(a);
assert(b == Vector4f(2, 5, 7, float .nan));
}
{
Vector3f a = Vector3f([0, 1]);
assert(a == Vector3f(0, 1, float .nan));
Vector4f b = a .xyy;
assert(b == Vector4f(0, 1, 1, float .nan));
}
{
Vector3f a = Vector3f([0, 1]);
a .xz = Vector2f([6, 1]);
assert(a == Vector3f([6, 1, 1]));
a .zxy = Vector3f([1, 2, 3]);
assert(a == Vector3f([2, 3, 1]));
}
{
Vector3f a = Vector3f(1, 2, 3);
a = a + 1;
assert(a == Vector3f(2, 3, 4));
a = a * 2;
assert(a == Vector3f(4, 6, 8));
a = a - 2;
assert(a == Vector3f(2, 4, 6));
a = a / 2;
assert(a == Vector3f(1, 2, 3));
Vector3f b = Vector3f(3, 2, 1);
b += a;
assert(b == Vector3f(4, 4, 4));
b *= b;
assert(b == Vector3f(16, 16, 16));
b /= Vector3f(8, 4, 2);
assert(b == Vector3f(2, 4, 8));
b -= a;
assert(b == Vector3f(1, 2, 5));
}
{
Vector3f v = Vector3f(0, 0, 0);
v[0] = 5;
v[1] = 2;
assert(v == Vector3f(5, 2, 0));
v[1..3] = 12;
assert(v == Vector3f(5, 12, 12));
v[] = 0;
assert(v == Vector3f(0, 0, 0));
}
{
Vector4f a = Vector4f(2, 4, 6, 8);
Vector4f b = a .wxyz;
assert(b == Vector4f(8, 2, 4, 6));
float d = dot(a, b);
assert(d == 96.0f);
}
{
Vector2f a = Vector2f(1, 2);
Vector2f b = Vector2f(2, 1);
float d = dot(a, b);
assert(d == 4.0f);
}