public void Constructors() { { var v = new decvec3(2m); Assert.AreEqual(2m, v.x); Assert.AreEqual(2m, v.y); Assert.AreEqual(2m, v.z); } { var v = new decvec3(-0.5m, 5m, 0m); Assert.AreEqual(-0.5m, v.x); Assert.AreEqual(5m, v.y); Assert.AreEqual(0m, v.z); } { var v = new decvec3(new decvec2(7m, 6m)); Assert.AreEqual(7m, v.x); Assert.AreEqual(6m, v.y); Assert.AreEqual(0m, v.z); } { var v = new decvec3(new decvec3(2.5m, 7.5m, -8m)); Assert.AreEqual(2.5m, v.x); Assert.AreEqual(7.5m, v.y); Assert.AreEqual(-8m, v.z); } { var v = new decvec3(new decvec4(-6.5m, 0m, -7.5m, -2.5m)); Assert.AreEqual(-6.5m, v.x); Assert.AreEqual(0m, v.y); Assert.AreEqual(-7.5m, v.z); } }
/// <summary> /// vector-and-scalar constructor (CAUTION: not angle-axis, use FromAngleAxis instead) /// </summary> public decquat(decvec3 v, decimal s) { this.x = v.x; this.y = v.y; this.z = v.z; this.w = s; }
/// <summary> /// Creates a quaternion from an axis and an angle (in radians). /// </summary> public static decquat FromAxisAngle(decimal angle, decvec3 v) { var s = Math.Sin((double)angle * 0.5); var c = Math.Cos((double)angle * 0.5); return(new decquat((decimal)((double)v.x * s), (decimal)((double)v.y * s), (decimal)((double)v.z * s), (decimal)c)); }
/// <summary> /// Returns a vector rotated by the quaternion. /// </summary> public static decvec3 operator*(decquat q, decvec3 v) { var qv = new decvec3(q.x, q.y, q.z); var uv = decvec3.Cross(qv, v); var uuv = decvec3.Cross(qv, uv); return(v + ((uv * q.w) + uuv) * 2); }
/// <summary> /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix. /// </summary> public decmat2x3(decvec3 c0, decvec3 c1) { this.m00 = c0.x; this.m01 = c0.y; this.m02 = c0.z; this.m10 = c1.x; this.m11 = c1.y; this.m12 = c1.z; }
/// <summary> /// Create a quaternion from two normalized axis (http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors) /// </summary> public decquat(decvec3 eulerAngle) { var c = decvec3.Cos(eulerAngle / 2); var s = decvec3.Sin(eulerAngle / 2); this.x = s.x * c.y * c.z - c.x * s.y * s.z; this.y = c.x * s.y * c.z + s.x * c.y * s.z; this.z = c.x * c.y * s.z - s.x * s.y * c.z; this.w = c.x * c.y * c.z + s.x * s.y * s.z; }
public void PropertyValues() { var v = new decvec3(-7m, 7m, 0.5m); var vals = v.Values; Assert.AreEqual(-7m, vals[0]); Assert.AreEqual(7m, vals[1]); Assert.AreEqual(0.5m, vals[2]); Assert.That(vals.SequenceEqual(v.ToArray())); }
public void SerializationJson() { var v0 = new decvec3(-7m, 0m, -1m); var s0 = JsonConvert.SerializeObject(v0); var v1 = JsonConvert.DeserializeObject <decvec3>(s0); var s1 = JsonConvert.SerializeObject(v1); Assert.AreEqual(v0, v1); Assert.AreEqual(s0, s1); }
/// <summary> /// Create a quaternion from two normalized axis (http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors) /// </summary> public decquat(decvec3 u, decvec3 v) { var localW = decvec3.Cross(u, v); var dot = decvec3.Dot(u, v); var q = new decquat(localW.x, localW.y, localW.z, 1m + dot).Normalized; this.x = q.x; this.y = q.y; this.z = q.z; this.w = q.w; }
/// <summary> /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix. /// </summary> public decmat3(decvec3 c0, decvec3 c1, decvec3 c2) { this.m00 = c0.x; this.m01 = c0.y; this.m02 = c0.z; this.m10 = c1.x; this.m11 = c1.y; this.m12 = c1.z; this.m20 = c2.x; this.m21 = c2.y; this.m22 = c2.z; }
/// <summary> /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix. /// </summary> public decmat3(decvec3 c0, decvec3 c1) { this.m00 = c0.x; this.m01 = c0.y; this.m02 = c0.z; this.m10 = c1.x; this.m11 = c1.y; this.m12 = c1.z; this.m20 = 0m; this.m21 = 0m; this.m22 = 1m; }
public void InvariantCrossDot() { { var v0 = new decvec3(7m, -1m, -4m); var v1 = new decvec3(-0.5m, 1m, 6m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(2.5m, -4m, 1.5m); var v1 = new decvec3(3m, 5.5m, 4m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(-7.5m, -8m, -1.5m); var v1 = new decvec3(9m, 5.5m, 1.5m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(9m, 4m, 8m); var v1 = new decvec3(8m, -0.5m, 9m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(4.5m, 1.5m, -2m); var v1 = new decvec3(1.5m, -5m, 4m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(-7m, -2m, -3m); var v1 = new decvec3(-7m, -3m, -5m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(-9.5m, -9m, -3m); var v1 = new decvec3(-4.5m, 8m, 2m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(5m, -6.5m, 5.5m); var v1 = new decvec3(-4m, 1m, 3.5m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(-6.5m, -5.5m, -5m); var v1 = new decvec3(-4m, -6.5m, 2m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } { var v0 = new decvec3(-9.5m, 8.5m, -8.5m); var v1 = new decvec3(4m, 4.5m, 9m); Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1); } }
public void InvariantCommutative() { { var v0 = new decvec3(-3.5m, -3m, -7m); var v1 = new decvec3(5.5m, -9m, -3m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(1.5m, -8m, -3m); var v1 = new decvec3(1m, 7.5m, 2m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-5m, 1.5m, 5m); var v1 = new decvec3(-4m, 1m, 7m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-9.5m, -3.5m, -2m); var v1 = new decvec3(8.5m, 0.5m, -1m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(4m, -3m, -9m); var v1 = new decvec3(-2m, -8m, 9.5m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-1m, 0m, -1.5m); var v1 = new decvec3(8.5m, -9.5m, -4.5m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-3m, 9m, -3m); var v1 = new decvec3(8m, -7m, -7m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-6m, 4.5m, -5m); var v1 = new decvec3(-9.5m, 4m, -5m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(-2m, 0m, 8m); var v1 = new decvec3(-1.5m, -3m, 1m); Assert.AreEqual(v0 * v1, v1 * v0); } { var v0 = new decvec3(9.5m, -2.5m, -7.5m); var v1 = new decvec3(6m, 1.5m, 5m); Assert.AreEqual(v0 * v1, v1 * v0); } }
public void InvariantCommutativeNeg() { { var v0 = new decvec3(-1.5m, -1m, 8m); var v1 = new decvec3(4m, -6m, 3m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(-1.5m, -7m, -1.5m); var v1 = new decvec3(-5.5m, -5.5m, -4m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(8.5m, 2.5m, -6.5m); var v1 = new decvec3(-8.5m, -2.5m, -3m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(-2m, -5m, 5m); var v1 = new decvec3(0m, 4.5m, -6m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(-7m, -9m, -4m); var v1 = new decvec3(-8.5m, 0.5m, -5.5m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(-0.5m, 2m, 2.5m); var v1 = new decvec3(0.5m, 0.5m, -1m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(7.5m, -8m, -6m); var v1 = new decvec3(-0.5m, -8m, 7m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(2.5m, -3.5m, -9.5m); var v1 = new decvec3(-3m, -0.5m, -7m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(9.5m, -7.5m, -0.5m); var v1 = new decvec3(0m, -5m, 3m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } { var v0 = new decvec3(-1.5m, -1.5m, -7m); var v1 = new decvec3(2.5m, -1.5m, 7.5m); Assert.AreEqual(v0 - v1, -(v1 - v0)); } }
public void TriangleInequality() { { var v0 = new decvec3(-4m, -7m, -4.5m); var v1 = new decvec3(3.5m, -8.5m, -7.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(5.5m, -4m, -1m); var v1 = new decvec3(1m, -9m, -1m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(-3m, -8m, 6.5m); var v1 = new decvec3(-1m, -4.5m, 2m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(2.5m, 2.5m, -7m); var v1 = new decvec3(8.5m, -3.5m, -8m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(6.5m, -6.5m, -8m); var v1 = new decvec3(-4m, 4m, -1.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(-2.5m, -8m, 5m); var v1 = new decvec3(0.5m, -9m, 1.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(3.5m, -8m, 5m); var v1 = new decvec3(-4m, -2m, 9.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(0.5m, -4m, 1m); var v1 = new decvec3(9.5m, -8m, 1.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(0m, 6.5m, 5m); var v1 = new decvec3(-1m, 9.5m, 0m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } { var v0 = new decvec3(9.5m, -6m, 0.5m); var v1 = new decvec3(6m, 6.5m, 7.5m); Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax); } }
public void Operators() { var v1 = new decvec3(-4.5m, 4.5m, 6m); var v2 = new decvec3(-4.5m, 4.5m, 6m); var v3 = new decvec3(6m, 4.5m, -4.5m); Assert.That(v1 == new decvec3(v1)); Assert.That(v2 == new decvec3(v2)); Assert.That(v3 == new decvec3(v3)); Assert.That(v1 == v2); Assert.That(v1 != v3); Assert.That(v2 != v3); }
public void StringInterop() { var v = new decvec3(-8.5m, 1m, -1m); var s0 = v.ToString(); var s1 = v.ToString("#"); var v0 = decvec3.Parse(s0); var v1 = decvec3.Parse(s1, "#"); Assert.AreEqual(v, v0); Assert.AreEqual(v, v1); var b0 = decvec3.TryParse(s0, out v0); var b1 = decvec3.TryParse(s1, "#", out v1); Assert.That(b0); Assert.That(b1); Assert.AreEqual(v, v0); Assert.AreEqual(v, v1); b0 = decvec3.TryParse(null, out v0); Assert.False(b0); b0 = decvec3.TryParse("", out v0); Assert.False(b0); b0 = decvec3.TryParse(s0 + ", 0", out v0); Assert.False(b0); Assert.Throws <NullReferenceException>(() => { decvec3.Parse(null); }); Assert.Throws <FormatException>(() => { decvec3.Parse(""); }); Assert.Throws <FormatException>(() => { decvec3.Parse(s0 + ", 0"); }); var s2 = v.ToString(";", CultureInfo.InvariantCulture); Assert.That(s2.Length > 0); var s3 = v.ToString("; ", "G"); var s4 = v.ToString("; ", "G", CultureInfo.InvariantCulture); var v3 = decvec3.Parse(s3, "; ", NumberStyles.Number); var v4 = decvec3.Parse(s4, "; ", NumberStyles.Number, CultureInfo.InvariantCulture); Assert.AreEqual(v, v3); Assert.AreEqual(v, v4); var b4 = decvec3.TryParse(s4, "; ", NumberStyles.Number, CultureInfo.InvariantCulture, out v4); Assert.That(b4); Assert.AreEqual(v, v4); }
/// <summary> /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix. /// </summary> public decmat4x3(decvec3 c0, decvec3 c1, decvec3 c2, decvec3 c3) { this.m00 = c0.x; this.m01 = c0.y; this.m02 = c0.z; this.m10 = c1.x; this.m11 = c1.y; this.m12 = c1.z; this.m20 = c2.x; this.m21 = c2.y; this.m22 = c2.z; this.m30 = c3.x; this.m31 = c3.y; this.m32 = c3.z; }
public void InvariantTriple() { { var v0 = new decvec3(1.5m, -5m, 3m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-3.5m, -9.5m, -7.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-8.5m, -1.5m, -6.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-1m, -8m, 3.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-2.5m, -2.5m, -1.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-2m, -4.5m, -9.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(6m, -3m, 0m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(7m, -2m, 0.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(0.5m, 7.5m, -4m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } { var v0 = new decvec3(-9.5m, -3m, 3.5m); Assert.AreEqual(v0 + v0 + v0, 3 * v0); } }
public void InvariantNorm() { { var v0 = new decvec3(-1.5m, 3m, -2.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(-2.5m, 9.5m, 9.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(7.5m, 2.5m, 0.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(7m, 3m, 4m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(-8m, 2m, -7.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(-6.5m, -8.5m, 8m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(2.5m, 5.5m, -0.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(8.5m, -5.5m, 3m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(-6m, 3.5m, -4.5m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } { var v0 = new decvec3(3m, 7m, -3m); Assert.LessOrEqual(v0.NormMax, v0.Norm); } }
public void InvariantIdNeg() { { var v0 = new decvec3(4.5m, 4.5m, -5.5m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(9m, 3.5m, 6m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(-7.5m, -3.5m, -6m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(7m, -2m, -2m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(-6m, 7.5m, 2m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(6.5m, 6.5m, -1.5m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(-1.5m, -5.5m, 5m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(-9.5m, -3.5m, 1.5m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(4.5m, -5.5m, -5m); Assert.AreEqual(v0, -(-v0)); } { var v0 = new decvec3(-8.5m, -3m, -5.5m); Assert.AreEqual(v0, -(-v0)); } }
public void InvariantDouble() { { var v0 = new decvec3(3m, 4.5m, -5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-5m, -7m, -2m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-6m, -2.5m, 8.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-9.5m, -7.5m, -9.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(7m, -3.5m, -6.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(6m, 9.5m, -4.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-2m, -2.5m, -5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-9m, 5m, 4.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(5.5m, -5m, -9.5m); Assert.AreEqual(v0 + v0, 2 * v0); } { var v0 = new decvec3(-8.5m, -7m, 7.5m); Assert.AreEqual(v0 + v0, 2 * v0); } }
public void InvariantId() { { var v0 = new decvec3(0m, -1m, 3m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-0.5m, -0.5m, 0.5m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(4.5m, 2m, 4.5m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-5m, 9m, 0m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(0m, 8.5m, 6m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-7m, -6.5m, 4m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(3m, -4m, 7.5m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-2.5m, 1.5m, -6.5m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-5m, 6m, -9m); Assert.AreEqual(v0, +v0); } { var v0 = new decvec3(-6.5m, -5.5m, 3m); Assert.AreEqual(v0, +v0); } }
public void InvariantAssociativeNeg() { { var v0 = new decvec3(-6.5m, 6m, -5m); var v1 = new decvec3(8.5m, 5m, -5.5m); var v2 = new decvec3(-0.5m, -1m, -5.5m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(-1.5m, 5.5m, 0m); var v1 = new decvec3(-8.5m, -6.5m, 6m); var v2 = new decvec3(-3m, 1.5m, 2m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(-2m, -8.5m, -8m); var v1 = new decvec3(7m, -6.5m, -8m); var v2 = new decvec3(-8.5m, 5.5m, -9.5m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(1m, 1m, 9.5m); var v1 = new decvec3(0m, 1m, -1.5m); var v2 = new decvec3(5.5m, -4m, 8.5m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(-8.5m, 0.5m, -2m); var v1 = new decvec3(2m, -0.5m, -4m); var v2 = new decvec3(3m, 4m, -9m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(7.5m, -8.5m, -4m); var v1 = new decvec3(-3m, 6m, -9.5m); var v2 = new decvec3(-0.5m, -2m, -2m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(7m, -6m, -6.5m); var v1 = new decvec3(7.5m, -7m, 9m); var v2 = new decvec3(3m, -1.5m, 8m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(-5.5m, -1.5m, 3.5m); var v1 = new decvec3(-2m, -4.5m, 9m); var v2 = new decvec3(8m, 1.5m, 1m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(0.5m, 9m, 1.5m); var v1 = new decvec3(3m, 4m, -9m); var v2 = new decvec3(8.5m, -5.5m, -5m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } { var v0 = new decvec3(6m, -1.5m, 5.5m); var v1 = new decvec3(-9.5m, -1m, 0.5m); var v2 = new decvec3(-7m, -1.5m, 8.5m); Assert.AreEqual(v0 * (v1 - v2), v0 * v1 - v0 * v2); } }
public void Indexer() { var v = new decvec3(-8m, 6.5m, -6m); Assert.AreEqual(-8m, v[0]); Assert.AreEqual(6.5m, v[1]); Assert.AreEqual(-6m, v[2]); Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[-2147483648]; }); Assert.Throws <ArgumentOutOfRangeException>(() => { v[-2147483648] = 0m; }); Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[-1]; }); Assert.Throws <ArgumentOutOfRangeException>(() => { v[-1] = 0m; }); Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[3]; }); Assert.Throws <ArgumentOutOfRangeException>(() => { v[3] = 0m; }); Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[2147483647]; }); Assert.Throws <ArgumentOutOfRangeException>(() => { v[2147483647] = 0m; }); Assert.Throws <ArgumentOutOfRangeException>(() => { var s = v[5]; }); Assert.Throws <ArgumentOutOfRangeException>(() => { v[5] = 0m; }); v[2] = 0m; Assert.AreEqual(0m, v[2]); v[0] = 1m; Assert.AreEqual(1m, v[0]); v[0] = 2m; Assert.AreEqual(2m, v[0]); v[0] = 3m; Assert.AreEqual(3m, v[0]); v[2] = 4m; Assert.AreEqual(4m, v[2]); v[0] = 5m; Assert.AreEqual(5m, v[0]); v[2] = 6m; Assert.AreEqual(6m, v[2]); v[1] = 7m; Assert.AreEqual(7m, v[1]); v[0] = 8m; Assert.AreEqual(8m, v[0]); v[2] = 9m; Assert.AreEqual(9m, v[2]); v[1] = -1m; Assert.AreEqual(-1m, v[1]); v[0] = -2m; Assert.AreEqual(-2m, v[0]); v[0] = -3m; Assert.AreEqual(-3m, v[0]); v[1] = -4m; Assert.AreEqual(-4m, v[1]); v[2] = -5m; Assert.AreEqual(-5m, v[2]); v[1] = -6m; Assert.AreEqual(-6m, v[1]); v[0] = -7m; Assert.AreEqual(-7m, v[0]); v[1] = -8m; Assert.AreEqual(-8m, v[1]); v[1] = -9m; Assert.AreEqual(-9m, v[1]); v[2] = -9.5m; Assert.AreEqual(-9.5m, v[2]); v[1] = -8.5m; Assert.AreEqual(-8.5m, v[1]); v[2] = -7.5m; Assert.AreEqual(-7.5m, v[2]); v[1] = -6.5m; Assert.AreEqual(-6.5m, v[1]); v[1] = -5.5m; Assert.AreEqual(-5.5m, v[1]); v[1] = -4.5m; Assert.AreEqual(-4.5m, v[1]); v[0] = -3.5m; Assert.AreEqual(-3.5m, v[0]); v[1] = -2.5m; Assert.AreEqual(-2.5m, v[1]); v[0] = -1.5m; Assert.AreEqual(-1.5m, v[0]); v[2] = -0.5m; Assert.AreEqual(-0.5m, v[2]); v[1] = 0.5m; Assert.AreEqual(0.5m, v[1]); v[1] = 1.5m; Assert.AreEqual(1.5m, v[1]); v[0] = 2.5m; Assert.AreEqual(2.5m, v[0]); v[0] = 3.5m; Assert.AreEqual(3.5m, v[0]); v[1] = 4.5m; Assert.AreEqual(4.5m, v[1]); v[1] = 5.5m; Assert.AreEqual(5.5m, v[1]); v[2] = 6.5m; Assert.AreEqual(6.5m, v[2]); v[2] = 7.5m; Assert.AreEqual(7.5m, v[2]); v[1] = 8.5m; Assert.AreEqual(8.5m, v[1]); v[0] = 9.5m; Assert.AreEqual(9.5m, v[0]); }
public void InvariantAssociative() { { var v0 = new decvec3(5.5m, -8.5m, -9.5m); var v1 = new decvec3(6m, 4m, 5.5m); var v2 = new decvec3(8.5m, -6m, -5.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(7.5m, 5m, 1.5m); var v1 = new decvec3(4m, -4.5m, -7m); var v2 = new decvec3(-0.5m, 2.5m, -3.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(-3m, 4m, -6m); var v1 = new decvec3(2.5m, 6.5m, 2m); var v2 = new decvec3(-6.5m, -4.5m, -6.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(3.5m, -0.5m, 9m); var v1 = new decvec3(-8.5m, -4.5m, 6.5m); var v2 = new decvec3(-1.5m, -4.5m, 6.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(3.5m, 4.5m, -9.5m); var v1 = new decvec3(-8.5m, 4m, 5m); var v2 = new decvec3(3m, -8.5m, 2m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(-4.5m, 1.5m, 4.5m); var v1 = new decvec3(-6m, -5.5m, -3.5m); var v2 = new decvec3(-2m, -1.5m, -6.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(-4m, 3m, -4.5m); var v1 = new decvec3(-7m, -5.5m, -9.5m); var v2 = new decvec3(-3m, 4m, -2.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(-4m, -6m, -8.5m); var v1 = new decvec3(4.5m, -7m, 9.5m); var v2 = new decvec3(-8.5m, 6.5m, 7.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(5m, 2.5m, 9.5m); var v1 = new decvec3(-1m, -1.5m, -5m); var v2 = new decvec3(0m, 7.5m, 4.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } { var v0 = new decvec3(-0.5m, -8m, 4m); var v1 = new decvec3(-5.5m, 9m, 6.5m); var v2 = new decvec3(-3m, -4m, -7.5m); Assert.AreEqual(v0 * (v1 + v2), v0 * v1 + v0 * v2); } }
/// <summary> /// OuterProduct treats the first parameter c as a column vector (matrix with one column) and the second parameter r as a row vector (matrix with one row) and does a linear algebraic matrix multiply c * r, yielding a matrix whose number of rows is the number of components in c and whose number of columns is the number of components in r. /// </summary> public static decmat3x2 OuterProduct(decvec2 c, decvec3 r) => decvec2.OuterProduct(c, r);
/// <summary> /// Rotates this quaternion from an axis and an angle (in radians). /// </summary> public static decquat Rotated(decquat q, decimal angle, decvec3 v) => q.Rotated(angle, v);
/// <summary> /// Returns a bvec3 from component-wise application of NotEqual (lhs != rhs). /// </summary> public static bvec3 NotEqual(decvec3 lhs, decvec3 rhs) => decvec3.NotEqual(lhs, rhs);
/// <summary> /// Rotates this quaternion from an axis and an angle (in radians). /// </summary> public decquat Rotated(decimal angle, decvec3 v) => this * FromAxisAngle(angle, v);