예제 #1
0
        /// <summary>
        /// Creates a quaternion from an axis and an angle (in radians).
        /// </summary>
        public static hquat FromAxisAngle(Half angle, hvec3 v)
        {
            var s = Math.Sin((double)angle * 0.5);
            var c = Math.Cos((double)angle * 0.5);

            return(new hquat((Half)((double)v.x * s), (Half)((double)v.y * s), (Half)((double)v.z * s), (Half)c));
        }
예제 #2
0
 public void Constructors()
 {
     {
         var v = new hvec3(new Half(-3.5));
         Assert.AreEqual(new Half(-3.5), v.x);
         Assert.AreEqual(new Half(-3.5), v.y);
         Assert.AreEqual(new Half(-3.5), v.z);
     }
     {
         var v = new hvec3(new Half(-4.5), new Half(8), new Half(-6.5));
         Assert.AreEqual(new Half(-4.5), v.x);
         Assert.AreEqual(new Half(8), v.y);
         Assert.AreEqual(new Half(-6.5), v.z);
     }
     {
         var v = new hvec3(new hvec2(new Half(7), new Half(9.5)));
         Assert.AreEqual(new Half(7), v.x);
         Assert.AreEqual(new Half(9.5), v.y);
         Assert.AreEqual(Half.Zero, v.z);
     }
     {
         var v = new hvec3(new hvec3(new Half(-3.5), new Half(-5.5), new Half(2)));
         Assert.AreEqual(new Half(-3.5), v.x);
         Assert.AreEqual(new Half(-5.5), v.y);
         Assert.AreEqual(new Half(2), v.z);
     }
     {
         var v = new hvec3(new hvec4(new Half(-2.5), new Half(3.5), new Half(-4.5), new Half(-0.5)));
         Assert.AreEqual(new Half(-2.5), v.x);
         Assert.AreEqual(new Half(3.5), v.y);
         Assert.AreEqual(new Half(-4.5), v.z);
     }
 }
예제 #3
0
 /// <summary>
 /// vector-and-scalar constructor (CAUTION: not angle-axis, use FromAngleAxis instead)
 /// </summary>
 public hquat(hvec3 v, Half s)
 {
     this.x = v.x;
     this.y = v.y;
     this.z = v.z;
     this.w = s;
 }
예제 #4
0
        /// <summary>
        /// Returns a vector rotated by the quaternion.
        /// </summary>
        public static hvec3 operator*(hquat q, hvec3 v)
        {
            var qv  = new hvec3(q.x, q.y, q.z);
            var uv  = hvec3.Cross(qv, v);
            var uuv = hvec3.Cross(qv, uv);

            return(v + ((uv * q.w) + uuv) * 2);
        }
예제 #5
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat2x3(hvec3 c0, hvec3 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;
 }
예제 #6
0
        /// <summary>
        /// Create a quaternion from two normalized axis (http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors)
        /// </summary>
        public hquat(hvec3 eulerAngle)
        {
            var c = hvec3.Cos(eulerAngle / 2);
            var s = hvec3.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;
        }
예제 #7
0
        public void PropertyValues()
        {
            var v    = new hvec3(new Half(-2), new Half(7), new Half(-5.5));
            var vals = v.Values;

            Assert.AreEqual(new Half(-2), vals[0]);
            Assert.AreEqual(new Half(7), vals[1]);
            Assert.AreEqual(new Half(-5.5), vals[2]);
            Assert.That(vals.SequenceEqual(v.ToArray()));
        }
예제 #8
0
        /// <summary>
        /// Create a quaternion from two normalized axis (http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors)
        /// </summary>
        public hquat(hvec3 u, hvec3 v)
        {
            var localW = hvec3.Cross(u, v);
            var dot    = hvec3.Dot(u, v);
            var q      = new hquat(localW.x, localW.y, localW.z, Half.One + dot).Normalized;

            this.x = q.x;
            this.y = q.y;
            this.z = q.z;
            this.w = q.w;
        }
예제 #9
0
        public void SerializationJson()
        {
            var v0 = new hvec3(new Half(-2), new Half(-4), new Half(3));
            var s0 = JsonConvert.SerializeObject(v0);

            var v1 = JsonConvert.DeserializeObject <hvec3>(s0);
            var s1 = JsonConvert.SerializeObject(v1);

            Assert.AreEqual(v0, v1);
            Assert.AreEqual(s0, s1);
        }
예제 #10
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat2x4(hvec3 c0, hvec3 c1)
 {
     this.m00 = c0.x;
     this.m01 = c0.y;
     this.m02 = c0.z;
     this.m03 = Half.Zero;
     this.m10 = c1.x;
     this.m11 = c1.y;
     this.m12 = c1.z;
     this.m13 = Half.Zero;
 }
예제 #11
0
 public void InvariantCrossDot()
 {
     {
         var v0 = new hvec3(new Half(-8.5), new Half(3), Half.Zero);
         var v1 = new hvec3(new Half(3.5), new Half(-4), new Half(9.5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(-3.5), new Half(7), new Half(0.5));
         var v1 = new hvec3(new Half(7), new Half(8.5), new Half(2));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(4.5), new Half(-8), new Half(3));
         var v1 = new hvec3(new Half(-1.5), new Half(1.5), new Half(-6.5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(Half.Zero, new Half(-9), new Half(2.5));
         var v1 = new hvec3(new Half(-6), new Half(3.5), new Half(8.5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(8), new Half(4), new Half(8));
         var v1 = new hvec3(new Half(-5.5), new Half(8.5), new Half(0.5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(-1), new Half(-3), new Half(1.5));
         var v1 = new hvec3(new Half(9), new Half(2.5), new Half(-7));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(-3), new Half(-6.5), new Half(-4.5));
         var v1 = new hvec3(new Half(-9.5), new Half(2.5), new Half(9.5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(-4), new Half(3.5), new Half(9.5));
         var v1 = new hvec3(new Half(-3.5), new Half(6.5), Half.One);
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(-7), new Half(7.5), new Half(-5));
         var v1 = new hvec3(new Half(7), new Half(-4), new Half(-5));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
     {
         var v0 = new hvec3(new Half(8), new Half(5), new Half(-1));
         var v1 = new hvec3(Half.One, new Half(-4.5), new Half(8));
         Assert.Less(glm.Abs(glm.Dot(v0, glm.Cross(v0, v1))), 0.1);
     }
 }
예제 #12
0
 public void TriangleInequality()
 {
     {
         var v0 = new hvec3(new Half(0.5), new Half(-8.5), Half.Zero);
         var v1 = new hvec3(new Half(-6.5), new Half(4), new Half(-3.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(9.5), Half.One, new Half(3.5));
         var v1 = new hvec3(new Half(-8.5), Half.Zero, new Half(-6.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(-9.5), Half.One, new Half(-8));
         var v1 = new hvec3(new Half(-5.5), new Half(3), new Half(-6.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(1.5), new Half(4), new Half(-1.5));
         var v1 = new hvec3(new Half(6.5), new Half(8.5), new Half(-5.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(-9), new Half(-6.5), Half.One);
         var v1 = new hvec3(new Half(-5), new Half(9.5), new Half(-8.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(-2.5), new Half(7.5), new Half(4));
         var v1 = new hvec3(new Half(4.5), new Half(-9), new Half(-3));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(-8.5), new Half(-2.5), new Half(3.5));
         var v1 = new hvec3(new Half(-8.5), new Half(2), new Half(-9));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(5), new Half(2), new Half(8.5));
         var v1 = new hvec3(new Half(3.5), new Half(6.5), new Half(-3));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(9.5), new Half(-3.5), new Half(2.5));
         var v1 = new hvec3(new Half(-6.5), new Half(-5.5), new Half(-3));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
     {
         var v0 = new hvec3(new Half(-7), new Half(3.5), new Half(-6.5));
         var v1 = new hvec3(new Half(-6), new Half(3), new Half(-7.5));
         Assert.GreaterOrEqual(v0.NormMax + v1.NormMax, (v0 + v1).NormMax);
     }
 }
예제 #13
0
 public void InvariantCommutativeNeg()
 {
     {
         var v0 = new hvec3(new Half(9.5), new Half(3), new Half(5));
         var v1 = new hvec3(new Half(-9), new Half(9.5), new Half(2));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(0.5), new Half(5), new Half(3.5));
         var v1 = new hvec3(new Half(-3.5), new Half(8), new Half(3.5));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(-8), new Half(2), new Half(7));
         var v1 = new hvec3(new Half(-7), new Half(9.5), Half.Zero);
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(8.5), new Half(8), new Half(5.5));
         var v1 = new hvec3(new Half(-5.5), new Half(-0.5), new Half(1.5));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(-2.5), new Half(-7), new Half(6));
         var v1 = new hvec3(new Half(3.5), new Half(-7.5), new Half(-2));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(9.5), new Half(-7.5), new Half(-2));
         var v1 = new hvec3(new Half(6.5), new Half(-5), new Half(-9.5));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(5.5), new Half(-4.5), new Half(-7.5));
         var v1 = new hvec3(new Half(-7), new Half(-6.5), new Half(4.5));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(new Half(-2.5), new Half(0.5), new Half(-5));
         var v1 = new hvec3(new Half(-3.5), new Half(9), new Half(-8));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(Half.Zero, new Half(9.5), Half.Zero);
         var v1 = new hvec3(new Half(-8.5), new Half(-7.5), new Half(-4));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
     {
         var v0 = new hvec3(Half.Zero, new Half(-6), new Half(-5));
         var v1 = new hvec3(new Half(-4), new Half(1.5), new Half(-7.5));
         Assert.AreEqual(v0 - v1, -(v1 - v0));
     }
 }
예제 #14
0
 public void InvariantCommutative()
 {
     {
         var v0 = new hvec3(new Half(8), new Half(5), new Half(-6));
         var v1 = new hvec3(new Half(-2.5), new Half(-3), new Half(0.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-5.5), new Half(-1.5), new Half(-6.5));
         var v1 = new hvec3(new Half(6), new Half(-8.5), new Half(-0.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(0.5), new Half(6.5), new Half(0.5));
         var v1 = new hvec3(new Half(0.5), new Half(3), new Half(-4.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-2), new Half(-3), new Half(5));
         var v1 = new hvec3(new Half(9.5), new Half(2), new Half(-8.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(3.5), new Half(8), new Half(8));
         var v1 = new hvec3(new Half(-3.5), new Half(-7), new Half(6));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-3), new Half(-9), new Half(7.5));
         var v1 = new hvec3(new Half(7.5), new Half(-8), new Half(-8));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(9), new Half(-2), new Half(2.5));
         var v1 = new hvec3(new Half(-9.5), new Half(6), new Half(-9.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-1.5), new Half(0.5), new Half(1.5));
         var v1 = new hvec3(new Half(3.5), new Half(9.5), new Half(7.5));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-0.5), new Half(-3), new Half(-4.5));
         var v1 = new hvec3(new Half(8), new Half(-4), new Half(6));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
     {
         var v0 = new hvec3(new Half(-8), new Half(9), new Half(2));
         var v1 = new hvec3(new Half(4.5), new Half(4.5), new Half(4));
         Assert.AreEqual(v0 * v1, v1 * v0);
     }
 }
예제 #15
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat3(hvec3 c0, hvec3 c1, hvec3 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;
 }
예제 #16
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat3(hvec3 c0, hvec3 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 = Half.Zero;
     this.m21 = Half.Zero;
     this.m22 = Half.One;
 }
예제 #17
0
        public void Operators()
        {
            var v1 = new hvec3(new Half(-4.5), new Half(-4.5), new Half(7.5));
            var v2 = new hvec3(new Half(-4.5), new Half(-4.5), new Half(7.5));
            var v3 = new hvec3(new Half(7.5), new Half(-4.5), new Half(-4.5));

            Assert.That(v1 == new hvec3(v1));
            Assert.That(v2 == new hvec3(v2));
            Assert.That(v3 == new hvec3(v3));
            Assert.That(v1 == v2);
            Assert.That(v1 != v3);
            Assert.That(v2 != v3);
        }
예제 #18
0
        public void StringInterop()
        {
            var v = new hvec3(new Half(7), new Half(-3), new Half(3));

            var s0 = v.ToString();
            var s1 = v.ToString("#");

            var v0 = hvec3.Parse(s0);
            var v1 = hvec3.Parse(s1, "#");

            Assert.AreEqual(v, v0);
            Assert.AreEqual(v, v1);

            var b0 = hvec3.TryParse(s0, out v0);
            var b1 = hvec3.TryParse(s1, "#", out v1);

            Assert.That(b0);
            Assert.That(b1);
            Assert.AreEqual(v, v0);
            Assert.AreEqual(v, v1);

            b0 = hvec3.TryParse(null, out v0);
            Assert.False(b0);
            b0 = hvec3.TryParse("", out v0);
            Assert.False(b0);
            b0 = hvec3.TryParse(s0 + ", 0", out v0);
            Assert.False(b0);

            Assert.Throws <NullReferenceException>(() => { hvec3.Parse(null); });
            Assert.Throws <FormatException>(() => { hvec3.Parse(""); });
            Assert.Throws <FormatException>(() => { hvec3.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 = hvec3.Parse(s3, "; ", NumberStyles.Number);
            var v4 = hvec3.Parse(s4, "; ", NumberStyles.Number, CultureInfo.InvariantCulture);

            Assert.AreEqual(v, v3);
            Assert.AreEqual(v, v4);

            var b4 = hvec3.TryParse(s4, "; ", NumberStyles.Number, CultureInfo.InvariantCulture, out v4);

            Assert.That(b4);
            Assert.AreEqual(v, v4);
        }
예제 #19
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat3x4(hvec3 c0, hvec3 c1, hvec3 c2)
 {
     this.m00 = c0.x;
     this.m01 = c0.y;
     this.m02 = c0.z;
     this.m03 = Half.Zero;
     this.m10 = c1.x;
     this.m11 = c1.y;
     this.m12 = c1.z;
     this.m13 = Half.Zero;
     this.m20 = c2.x;
     this.m21 = c2.y;
     this.m22 = c2.z;
     this.m23 = Half.Zero;
 }
예제 #20
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat4x3(hvec3 c0, hvec3 c1, hvec3 c2, hvec3 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;
 }
예제 #21
0
 /// <summary>
 /// Constructs this matrix from a series of column vectors. Non-overwritten fields are from an Identity matrix.
 /// </summary>
 public hmat4x3(hvec3 c0, hvec3 c1, hvec3 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;
     this.m30 = Half.Zero;
     this.m31 = Half.Zero;
     this.m32 = Half.Zero;
 }
예제 #22
0
        public void HalfSerializationJson()
        {
            var h  = new Half(2.2);
            var sh = JsonConvert.SerializeObject(h);

            Console.WriteLine(sh);

            var v0 = new hvec3(new Half(-2), new Half(-4), new Half(3));
            var s0 = JsonConvert.SerializeObject(v0);

            var v1 = JsonConvert.DeserializeObject <hvec3>(s0);
            var s1 = JsonConvert.SerializeObject(v1);

            Assert.AreEqual(v0, v1);
            Assert.AreEqual(s0, s1);
        }
예제 #23
0
 public void InvariantId()
 {
     {
         var v0 = new hvec3(new Half(8), new Half(8), Half.One);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(-4), new Half(-4.5), new Half(2));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(7), new Half(6), new Half(0.5));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(7), new Half(-7.5), new Half(9));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(-9), new Half(2), new Half(-5));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(9.5), Half.One, new Half(1.5));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(-7), new Half(3), new Half(-6.5));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(-5.5), new Half(8.5), Half.One);
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(new Half(-7.5), new Half(-3), new Half(-9));
         Assert.AreEqual(v0, +v0);
     }
     {
         var v0 = new hvec3(Half.One, new Half(2.5), new Half(8.5));
         Assert.AreEqual(v0, +v0);
     }
 }
예제 #24
0
 public void InvariantDouble()
 {
     {
         var v0 = new hvec3(new Half(-5.5), new Half(-9.5), new Half(9.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(7), new Half(7.5), new Half(5.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(2), new Half(5.5), new Half(-7.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(0.5), new Half(-2), new Half(-2.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(8), new Half(8), new Half(7));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(2.5), new Half(-1.5), new Half(-1.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(8.5), new Half(6.5), new Half(-3.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(6), new Half(-7), new Half(-4));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(7), new Half(-8.5), Half.Zero);
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
     {
         var v0 = new hvec3(new Half(4.5), new Half(6.5), new Half(7.5));
         Assert.AreEqual(v0 + v0, 2 * v0);
     }
 }
예제 #25
0
 public void InvariantTriple()
 {
     {
         var v0 = new hvec3(new Half(-8), new Half(4), Half.One);
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(-7), new Half(4.5), new Half(-2));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(-8.5), new Half(-8.5), new Half(2));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(-2), new Half(-4), new Half(-7));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(2.5), new Half(-5), new Half(3.5));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(4), new Half(9.5), new Half(-5));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(-4), new Half(4), new Half(-9));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(3), new Half(-8), new Half(4.5));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(5), new Half(-6.5), new Half(-5.5));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
     {
         var v0 = new hvec3(new Half(3), new Half(3), new Half(8));
         Assert.AreEqual(v0 + v0 + v0, 3 * v0);
     }
 }
예제 #26
0
 public void InvariantIdNeg()
 {
     {
         var v0 = new hvec3(new Half(4.5), new Half(-9.5), new Half(-0.5));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(-3), new Half(-7.5), Half.Zero);
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(6.5), new Half(5.5), new Half(4));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(2), new Half(-7.5), new Half(5.5));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(Half.Zero, new Half(7.5), new Half(-0.5));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(Half.One, new Half(0.5), new Half(-4.5));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(-7.5), new Half(9.5), new Half(5.5));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(5), new Half(6.5), new Half(-7));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(8), new Half(-2), new Half(4));
         Assert.AreEqual(v0, -(-v0));
     }
     {
         var v0 = new hvec3(new Half(4.5), Half.Zero, new Half(-1));
         Assert.AreEqual(v0, -(-v0));
     }
 }
예제 #27
0
 public void InvariantNorm()
 {
     {
         var v0 = new hvec3(new Half(-8.5), new Half(-6), new Half(-7));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-7), new Half(-5), new Half(3.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(4), new Half(-7), new Half(4.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-5), new Half(-1.5), new Half(5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(Half.One, new Half(8.5), new Half(9.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(3.5), new Half(3), new Half(-3.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-1.5), new Half(-7.5), new Half(0.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-2), new Half(5), new Half(-8.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-8.5), new Half(-3.5), new Half(-3));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
     {
         var v0 = new hvec3(new Half(-8.5), new Half(8), new Half(-0.5));
         Assert.LessOrEqual(v0.NormMax, v0.Norm);
     }
 }
예제 #28
0
 /// <summary>
 /// Rotates this quaternion from an axis and an angle (in radians).
 /// </summary>
 public static hquat Rotated(hquat q, Half angle, hvec3 v) => q.Rotated(angle, v);
예제 #29
0
 /// <summary>
 /// Rotates this quaternion from an axis and an angle (in radians).
 /// </summary>
 public hquat Rotated(Half angle, hvec3 v) => this * FromAxisAngle(angle, v);
예제 #30
0
 /// <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 hmat3x4 OuterProduct(hvec4 c, hvec3 r) => hvec4.OuterProduct(c, r);