Пример #1
0
        public void Matrix3x2CreateScaleCenterTest2()
        {
            Single  scale  = 5;
            Vector2 center = new Vector2(23, 42);

            Matrix3x2 scaleAroundZero         = Matrix3x2.CreateScale(scale, Vector2.Zero);
            Matrix3x2 scaleAroundZeroExpected = Matrix3x2.CreateScale(scale);

            Assert.True(MathHelper.Equal(scaleAroundZero, scaleAroundZeroExpected));

            Matrix3x2 scaleAroundCenter         = Matrix3x2.CreateScale(scale, center);
            Matrix3x2 scaleAroundCenterExpected = Matrix3x2.CreateTranslation(-center) * Matrix3x2.CreateScale(scale) * Matrix3x2.CreateTranslation(center);

            Assert.True(MathHelper.Equal(scaleAroundCenter, scaleAroundCenterExpected));
        }
Пример #2
0
        public void Matrix3x2CreateSkewCenterTest()
        {
            Single  skewX = 1, skewY = 2;
            Vector2 center = new Vector2(23, 42);

            Matrix3x2 skewAroundZero         = Matrix3x2.CreateSkew(skewX, skewY, Vector2.Zero);
            Matrix3x2 skewAroundZeroExpected = Matrix3x2.CreateSkew(skewX, skewY);

            Assert.True(MathHelper.Equal(skewAroundZero, skewAroundZeroExpected));

            Matrix3x2 skewAroundCenter         = Matrix3x2.CreateSkew(skewX, skewY, center);
            Matrix3x2 skewAroundCenterExpected = Matrix3x2.CreateTranslation(-center) * Matrix3x2.CreateSkew(skewX, skewY) * Matrix3x2.CreateTranslation(center);

            Assert.True(MathHelper.Equal(skewAroundCenter, skewAroundCenterExpected));
        }
Пример #3
0
        public void Matrix3x2CreateRotationCenterTest()
        {
            Single  radians = MathHelper.ToRadians(30.0f);
            Vector2 center  = new Vector2(23, 42);

            Matrix3x2 rotateAroundZero         = Matrix3x2.CreateRotation(radians, Vector2.Zero);
            Matrix3x2 rotateAroundZeroExpected = Matrix3x2.CreateRotation(radians);

            Assert.True(MathHelper.Equal(rotateAroundZero, rotateAroundZeroExpected));

            Matrix3x2 rotateAroundCenter         = Matrix3x2.CreateRotation(radians, center);
            Matrix3x2 rotateAroundCenterExpected = Matrix3x2.CreateTranslation(-center) * Matrix3x2.CreateRotation(radians) * Matrix3x2.CreateTranslation(center);

            Assert.True(MathHelper.Equal(rotateAroundCenter, rotateAroundCenterExpected));
        }
Пример #4
0
        public void Vector2TransformByQuaternionTest()
        {
            Vector2 v = new Vector2(1.0f, 2.0f);

            Matrix4x4 m =
                Matrix4x4.CreateRotationX(MathHelper.ToRadians(30.0f)) *
                Matrix4x4.CreateRotationY(MathHelper.ToRadians(30.0f)) *
                Matrix4x4.CreateRotationZ(MathHelper.ToRadians(30.0f));
            Quaternion q = Quaternion.CreateFromRotationMatrix(m);

            Vector2 expected = Vector2.Transform(v, m);
            Vector2 actual   = Vector2.Transform(v, q);

            Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Transform did not return the expected value.");
        }
Пример #5
0
        public void Matrix3x2CreateScaleCenterTest3()
        {
            Vector2 scale  = new Vector2(3, 4);
            Vector2 center = new Vector2(23, 42);

            Matrix3x2 scaleAroundZero         = Matrix3x2.CreateScale(scale.X, scale.Y, Vector2.Zero);
            Matrix3x2 scaleAroundZeroExpected = Matrix3x2.CreateScale(scale.X, scale.Y);

            Assert.True(MathHelper.Equal(scaleAroundZero, scaleAroundZeroExpected));

            Matrix3x2 scaleAroundCenter         = Matrix3x2.CreateScale(scale.X, scale.Y, center);
            Matrix3x2 scaleAroundCenterExpected = Matrix3x2.CreateTranslation(-center) * Matrix3x2.CreateScale(scale.X, scale.Y) * Matrix3x2.CreateTranslation(center);

            Assert.True(MathHelper.Equal(scaleAroundCenter, scaleAroundCenterExpected));
        }
Пример #6
0
        public void SetFieldsTest()
        {
            Vector2 v3 = new Vector2(4f, 5f);

            v3.X = 1.0f;
            v3.Y = 2.0f;
            Assert.Equal(1.0f, v3.X);
            Assert.Equal(2.0f, v3.Y);
            Vector2 v4 = v3;

            v4.Y = 0.5f;
            Assert.Equal(1.0f, v4.X);
            Assert.Equal(0.5f, v4.Y);
            Assert.Equal(2.0f, v3.Y);
        }
Пример #7
0
        public static void SquareRootJitOptimizeCanaryBenchmark()
        {
            var expectedResult = new Vector2(Single.NaN, 2.81474977e+14f);

            foreach (var iteration in Benchmark.Iterations)
            {
                Vector2 actualResult;

                using (iteration.StartMeasurement())
                {
                    actualResult = SquareRootJitOptimizeCanaryTest();
                }

                VectorTests.AssertEqual(expectedResult, actualResult);
            }
        }
Пример #8
0
        public static void SquareRootBenchmark()
        {
            var expectedResult = new Vector2(Single.NaN, 1.0f);

            foreach (var iteration in Benchmark.Iterations)
            {
                Vector2 actualResult;

                using (iteration.StartMeasurement())
                {
                    actualResult = SquareRootTest();
                }

                VectorTests.AssertEqual(expectedResult, actualResult);
            }
        }
Пример #9
0
        /// <summary>
        /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center.
        /// </summary>
        /// <param name="scale">The uniform scale to use.</param>
        /// <param name="centerPoint">The center offset.</param>
        /// <returns>A scaling matrix.</returns>
        public static Matrix3x2 CreateScale(Single scale, Vector2 centerPoint)
        {
            Matrix3x2 result;

            Single tx = centerPoint.X * (1 - scale);
            Single ty = centerPoint.Y * (1 - scale);

            result.M11 = scale;
            result.M12 = 0.0f;
            result.M21 = 0.0f;
            result.M22 = scale;
            result.M31 = tx;
            result.M32 = ty;

            return(result);
        }
Пример #10
0
        public static void NormalizeJitOptimizeCanaryBenchmark()
        {
            var expectedResult = new Vector2(-16777216.0f, 16777216.0f);

            foreach (var iteration in Benchmark.Iterations)
            {
                Vector2 actualResult;

                using (iteration.StartMeasurement())
                {
                    actualResult = NormalizeJitOptimizeCanaryTest();
                }

                VectorTests.AssertEqual(expectedResult, actualResult);
            }
        }
Пример #11
0
        public static void NormalizeBenchmark()
        {
            var expectedResult = new Vector2(-0.707106829f, 0.707106829f);

            foreach (var iteration in Benchmark.Iterations)
            {
                Vector2 actualResult;

                using (iteration.StartMeasurement())
                {
                    actualResult = NormalizeTest();
                }

                VectorTests.AssertEqual(expectedResult, actualResult);
            }
        }
Пример #12
0
 /// This constructor sets the body definition default values.
 public BodyDef()
 {
     UserData        = null;
     Position        = Vector2.Zero;
     Angle           = 0.0f;
     LinearVelocity  = Vector2.Zero;
     AngularVelocity = 0.0f;
     LinearDamping   = 0.0f;
     AngularDamping  = 0.0f;
     AllowSleep      = true;
     Awake           = true;
     FixedRotation   = false;
     Bullet          = false;
     BodyType        = BodyType.StaticBody;
     Active          = true;
     GravityScale    = 1.0f;
 }
Пример #13
0
        public PulleyJoint(PulleyJointDef def) : base(def)
        {
            _groundAnchorA = def.GroundAnchorA;
            _groundAnchorB = def.GroundAnchorB;
            _localAnchorA  = def.LocalAnchorA;
            _localAnchorB  = def.LocalAnchorB;

            _lengthA = def.LengthA;
            _lengthB = def.LengthB;

            Debug.Assert(!def.Ratio.Equals(0.0f));
            _ratio = def.Ratio;

            _constant = def.LengthA + _ratio * def.LengthB;

            _impulse = 0.0f;
        }
Пример #14
0
        public void Vector2EqualsTest1()
        {
            Vector2 a = new Vector2(1.0f, 2.0f);
            Vector2 b = new Vector2(1.0f, 2.0f);

            // case 1: compare between same values
            bool expected = true;
            bool actual   = a.Equals(b);

            Assert.Equal(expected, actual);

            // case 2: compare between different values
            b.X      = 10.0f;
            expected = false;
            actual   = a.Equals(b);
            Assert.Equal(expected, actual);
        }
Пример #15
0
        internal RevoluteJoint(RevoluteJointDef def) : base(def)
        {
            LocalAnchorA   = def.LocalAnchorA;
            LocalAnchorB   = def.LocalAnchorB;
            ReferenceAngle = def.ReferenceAngle;

            _impulse.SetZero();
            _motorImpulse = 0.0f;

            _lowerAngle     = def.LowerAngle;
            _upperAngle     = def.UpperAngle;
            _maxMotorTorque = def.MaxMotorTorque;
            _motorSpeed     = def.MotorSpeed;
            _enableLimit    = def.EnableLimit;
            _enableMotor    = def.EnableMotor;
            _limitState     = LimitState.InactiveLimit;
        }
Пример #16
0
        public void Vector2TransformNormalTest()
        {
            Vector2   v = new Vector2(1.0f, 2.0f);
            Matrix4x4 m =
                Matrix4x4.CreateRotationX(MathHelper.ToRadians(30.0f)) *
                Matrix4x4.CreateRotationY(MathHelper.ToRadians(30.0f)) *
                Matrix4x4.CreateRotationZ(MathHelper.ToRadians(30.0f));

            m.M41 = 10.0f;
            m.M42 = 20.0f;
            m.M43 = 30.0f;

            Vector2 expected = new Vector2(0.3169873f, 2.18301272f);
            Vector2 actual;

            actual = Vector2.TransformNormal(v, m);
            Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Tranform did not return the expected value.");
        }
Пример #17
0
        public void Vector2EqualsNanTest()
        {
            Vector2 a = new Vector2(Single.NaN, 0);
            Vector2 b = new Vector2(0, Single.NaN);

            Assert.False(a == Vector2.Zero);
            Assert.False(b == Vector2.Zero);

            Assert.True(a != Vector2.Zero);
            Assert.True(b != Vector2.Zero);

            Assert.False(a.Equals(Vector2.Zero));
            Assert.False(b.Equals(Vector2.Zero));

            // Counterintuitive result - IEEE rules for NaN comparison are weird!
            Assert.False(a.Equals(a));
            Assert.False(b.Equals(b));
        }
Пример #18
0
        /// <summary>
        /// Creates a skew matrix from the given angles in radians and a center point.
        /// </summary>
        /// <param name="radiansX">The X angle, in radians.</param>
        /// <param name="radiansY">The Y angle, in radians.</param>
        /// <param name="centerPoint">The center point.</param>
        /// <returns>A skew matrix.</returns>
        public static Matrix3x2 CreateSkew(Single radiansX, Single radiansY, Vector2 centerPoint)
        {
            Matrix3x2 result;

            Single xTan = MathF.Tan(radiansX);
            Single yTan = MathF.Tan(radiansY);

            Single tx = -centerPoint.Y * xTan;
            Single ty = -centerPoint.X * yTan;

            result.M11 = 1.0f;
            result.M12 = yTan;
            result.M21 = xTan;
            result.M22 = 1.0f;
            result.M31 = tx;
            result.M32 = ty;

            return(result);
        }
Пример #19
0
        internal MouseJoint(MouseJointDef def) : base(def)
        {
            Debug.Assert(def.Target.IsValid());
            Debug.Assert(def.MaxForce.IsValid() && def.MaxForce >= 0.0f);
            Debug.Assert(def.FrequencyHz.IsValid() && def.FrequencyHz >= 0.0f);
            Debug.Assert(def.DampingRatio.IsValid() && def.DampingRatio >= 0.0f);

            _targetA      = def.Target;
            _localAnchorB = MathUtils.MulT(BodyB.GetTransform(), _targetA);

            _maxForce = def.MaxForce;
            _impulse.SetZero();

            _frequencyHz  = def.FrequencyHz;
            _dampingRatio = def.DampingRatio;

            _beta  = 0.0f;
            _gamma = 0.0f;
        }
Пример #20
0
        public void Matrix3x2CreateSkewXYTest()
        {
            Matrix3x2 expected = new Matrix3x2(1, -0.414213562373095f, 1, 1, 0, 0);
            Matrix3x2 actual   = Matrix3x2.CreateSkew(MathHelper.Pi / 4, -MathHelper.Pi / 8);

            Assert.True(MathHelper.Equal(expected, actual));

            Vector2 result = Vector2.Transform(new Vector2(0, 0), actual);

            Assert.True(MathHelper.Equal(new Vector2(0, 0), result));

            result = Vector2.Transform(new Vector2(1, 0), actual);
            Assert.True(MathHelper.Equal(new Vector2(1, -0.414213562373095f), result));

            result = Vector2.Transform(new Vector2(0, 1), actual);
            Assert.True(MathHelper.Equal(new Vector2(1, 1), result));

            result = Vector2.Transform(new Vector2(1, 1), actual);
            Assert.True(MathHelper.Equal(new Vector2(2, 0.585786437626905f), result));
        }
Пример #21
0
        public void Vector2MinMaxCodeCoverageTest()
        {
            Vector2 min = new Vector2(0, 0);
            Vector2 max = new Vector2(1, 1);
            Vector2 actual;

            // Min.
            actual = Vector2.Min(min, max);
            Assert.Equal(actual, min);

            actual = Vector2.Min(max, min);
            Assert.Equal(actual, min);

            // Max.
            actual = Vector2.Max(min, max);
            Assert.Equal(actual, max);

            actual = Vector2.Max(max, min);
            Assert.Equal(actual, max);
        }
Пример #22
0
        public void Vector2GetHashCodeTest()
        {
            Vector2 v1 = new Vector2(2.0f, 3.0f);
            Vector2 v2 = new Vector2(2.0f, 3.0f);
            Vector2 v3 = new Vector2(3.0f, 2.0f);

            Assert.Equal(v1.GetHashCode(), v1.GetHashCode());
            Assert.Equal(v1.GetHashCode(), v2.GetHashCode());
            Assert.NotEqual(v1.GetHashCode(), v3.GetHashCode());
            Vector2 v4 = new Vector2(0.0f, 0.0f);
            Vector2 v6 = new Vector2(1.0f, 0.0f);
            Vector2 v7 = new Vector2(0.0f, 1.0f);
            Vector2 v8 = new Vector2(1.0f, 1.0f);

            Assert.NotEqual(v4.GetHashCode(), v6.GetHashCode());
            Assert.NotEqual(v4.GetHashCode(), v7.GetHashCode());
            Assert.NotEqual(v4.GetHashCode(), v8.GetHashCode());
            Assert.NotEqual(v7.GetHashCode(), v6.GetHashCode());
            Assert.NotEqual(v8.GetHashCode(), v6.GetHashCode());
            Assert.NotEqual(v8.GetHashCode(), v7.GetHashCode());
        }
Пример #23
0
        public static Vector4 Transform(Vector2 value, Quaternion rotation)
        {
            Single x2 = rotation.X + rotation.X;
            Single y2 = rotation.Y + rotation.Y;
            Single z2 = rotation.Z + rotation.Z;

            Single wx2 = rotation.W * x2;
            Single wy2 = rotation.W * y2;
            Single wz2 = rotation.W * z2;
            Single xx2 = rotation.X * x2;
            Single xy2 = rotation.X * y2;
            Single xz2 = rotation.X * z2;
            Single yy2 = rotation.Y * y2;
            Single yz2 = rotation.Y * z2;
            Single zz2 = rotation.Z * z2;

            return(new Vector4(
                       value.X * (1.0f - yy2 - zz2) + value.Y * (xy2 - wz2),
                       value.X * (xy2 + wz2) + value.Y * (1.0f - xx2 - zz2),
                       value.X * (xz2 - wy2) + value.Y * (yz2 + wx2),
                       1.0f));
        }
Пример #24
0
        public void Matrix3x2TranslationTest()
        {
            Matrix3x2 a = GenerateTestMatrix();
            Matrix3x2 b = a;

            // Transformed vector that has same semantics of property must be same.
            Vector2 val = new Vector2(a.M31, a.M32);

            Assert.Equal(val, a.Translation);

            // Set value and get value must be same.
            val           = new Vector2(1.0f, 2.0f);
            a.Translation = val;
            Assert.Equal(val, a.Translation);

            // Make sure it only modifies expected value of matrix.
            Assert.True(
                a.M11 == b.M11 && a.M12 == b.M12 &&
                a.M21 == b.M21 && a.M22 == b.M22 &&
                a.M31 != b.M31 && a.M32 != b.M32,
                "Matrix3x2.Translation modified unexpected value of matrix.");
        }
Пример #25
0
        public void Vector2ReflectTest()
        {
            Vector2 a = Vector2.Normalize(new Vector2(1.0f, 1.0f));

            // Reflect on XZ plane.
            Vector2 n        = new Vector2(0.0f, 1.0f);
            Vector2 expected = new Vector2(a.X, -a.Y);
            Vector2 actual   = Vector2.Reflect(a, n);

            Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Reflect did not return the expected value.");

            // Reflect on XY plane.
            n        = new Vector2(0.0f, 0.0f);
            expected = new Vector2(a.X, a.Y);
            actual   = Vector2.Reflect(a, n);
            Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Reflect did not return the expected value.");

            // Reflect on YZ plane.
            n        = new Vector2(1.0f, 0.0f);
            expected = new Vector2(-a.X, a.Y);
            actual   = Vector2.Reflect(a, n);
            Assert.True(MathHelper.Equal(expected, actual), "Vector2f.Reflect did not return the expected value.");
        }
Пример #26
0
        public void Matrix3x2CreateSkewYTest()
        {
            Matrix3x2 expected = new Matrix3x2(1, -0.414213562373095f, 0, 1, 0, 0);
            Matrix3x2 actual   = Matrix3x2.CreateSkew(0, -MathHelper.Pi / 8);

            Assert.True(MathHelper.Equal(expected, actual));

            expected = new Matrix3x2(1, 0.414213562373095f, 0, 1, 0, 0);
            actual   = Matrix3x2.CreateSkew(0, MathHelper.Pi / 8);
            Assert.True(MathHelper.Equal(expected, actual));

            Vector2 result = Vector2.Transform(new Vector2(0, 0), actual);

            Assert.True(MathHelper.Equal(new Vector2(0, 0), result));

            result = Vector2.Transform(new Vector2(1, 0), actual);
            Assert.True(MathHelper.Equal(new Vector2(1, 0.414213568f), result));

            result = Vector2.Transform(new Vector2(-1, 0), actual);
            Assert.True(MathHelper.Equal(new Vector2(-1, -0.414213568f), result));

            result = Vector2.Transform(new Vector2(10, 3), actual);
            Assert.True(MathHelper.Equal(new Vector2(10, 7.14213568f), result));
        }
Пример #27
0
        public void Matrix3x2CreateRotationRightAngleCenterTest()
        {
            Vector2 center = new Vector2(3, 7);

            // 90 degree rotations must be exact!
            Matrix3x2 actual = Matrix3x2.CreateRotation(0, center);

            Assert.Equal(new Matrix3x2(1, 0, 0, 1, 0, 0), actual);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi / 2, center);
            Assert.Equal(new Matrix3x2(0, 1, -1, 0, 10, 4), actual);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi, center);
            Assert.Equal(new Matrix3x2(-1, 0, 0, -1, 6, 14), actual);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi * 3 / 2, center);
            Assert.Equal(new Matrix3x2(0, -1, 1, 0, -4, 10), actual);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi * 2, center);
            Assert.Equal(new Matrix3x2(1, 0, 0, 1, 0, 0), actual);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi * 5 / 2, center);
            Assert.Equal(new Matrix3x2(0, 1, -1, 0, 10, 4), actual);

            actual = Matrix3x2.CreateRotation(-MathHelper.Pi / 2, center);
            Assert.Equal(new Matrix3x2(0, -1, 1, 0, -4, 10), actual);

            // But merely close-to-90 rotations should not be excessively clamped.
            Single delta = MathHelper.ToRadians(0.01f);

            actual = Matrix3x2.CreateRotation(MathHelper.Pi + delta, center);
            Assert.False(MathHelper.Equal(new Matrix3x2(-1, 0, 0, -1, 6, 14), actual));

            actual = Matrix3x2.CreateRotation(MathHelper.Pi - delta, center);
            Assert.False(MathHelper.Equal(new Matrix3x2(-1, 0, 0, -1, 6, 14), actual));
        }
Пример #28
0
        internal PrismaticJoint(PrismaticJointDef def) : base(def)
        {
            LocalAnchorA = def.LocalAnchorA;
            LocalAnchorB = def.LocalAnchorB;
            LocalXAxisA  = def.LocalAxisA;
            LocalXAxisA.Normalize();
            _localYAxisA   = MathUtils.Cross(1.0f, LocalXAxisA);
            ReferenceAngle = def.ReferenceAngle;

            _impulse.SetZero();
            _motorMass    = 0.0f;
            _motorImpulse = 0.0f;

            _lowerTranslation = def.LowerTranslation;
            _upperTranslation = def.UpperTranslation;
            _maxMotorForce    = def.MaxMotorForce;
            _motorSpeed       = def.MotorSpeed;
            _enableLimit      = def.EnableLimit;
            _enableMotor      = def.EnableMotor;
            _limitState       = LimitState.InactiveLimit;

            _axis.SetZero();
            _perp.SetZero();
        }
Пример #29
0
 public static bool Equal(Vector2 a, Vector2 b)
 {
     return(Equal(a.X, b.X) && Equal(a.Y, b.Y));
 }
Пример #30
0
 public void SpawnBomb(Vector2 worldPt)
 {
     BombSpawnPoint = worldPt;
     BombSpawning   = true;
 }