Beispiel #1
0
        /// <summary>
        /// 处理角落的力反馈:攻击角落的敌人,攻击者向远离方向运动
        /// </summary>
        /// <param name="attacker"></param>
        /// <param name="target"></param>
        private static void ProcessCornerPush(Entity attacker, Entity target)
        {
            var hitDef = attacker.GetComponent <HitComponent>().HitDef;

            if (UtilityFuncs.GetFrontStageDist(attacker) < new Number(5) / new Number(10) && hitDef.moveContact)
            {
                Number velX = 0;
                if (hitDef.moveGuarded)
                {
                    velX = hitDef.guardVel.X();
                }
                else if (hitDef.moveHit)
                {
                    var targetMoveComponent = target.GetComponent <MoveComponent>();
                    if (targetMoveComponent.PhysicsType == PhysicsType.Air)
                    {
                        velX = hitDef.airVel.X();
                    }
                    else
                    {
                        velX = hitDef.groundVel.X();
                    }
                }

                var moveComponent = attacker.GetComponent <MoveComponent>();
                if (moveComponent.PhysicsType == PhysicsType.Air)
                {
                    moveComponent.VelAdd(-Number.Abs(velX) * hitDef.airCornerPush, 0);
                }
                else
                {
                    moveComponent.VelAdd(-Number.Abs(velX) * hitDef.groundCornerPush, 0);
                }
            }
        }
Beispiel #2
0
        public void AssertSystemSolvable(List <Entity> equations, List <VariableEntity> vars, int rootCount = -1)
        {
            var sys = MathS.Equations(equations.ToArray());
            var sol = sys.Solve(vars.ToArray());

            Assert.IsTrue(sol.Shape[0] == rootCount || rootCount == -1, "Got " + sol.Shape[0] + " instead of " + rootCount);
            for (int i = 0; i < sol.Shape[0]; i++)
            {
                foreach (var eq in equations)
                {
                    var eqCopy = eq.DeepCopy();
                    Assert.AreEqual(sol.Shape[1], vars.Count, "Incorrect output of Solve");
                    for (int rootid = 0; rootid < sol.Shape[1]; rootid++)
                    {
                        eqCopy = eqCopy.Substitute(vars[rootid], sol[i, rootid]);
                    }

                    foreach (var uniqvar in MathS.Utils.GetUniqueVariables(eqCopy).FiniteSet())
                    {
                        eqCopy = eqCopy.Substitute(uniqvar.Name, 3);
                    }
                    var E = Number.Abs(eqCopy.Eval());
                    Assert.IsTrue(E.IsDefinite() && E < 0.0001,
                                  "i: " + i + "  eq: " + eq.ToString() + "  E: " + E.ToString());
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Perform one iteration of searching for a root with Newton-Raphson method
        /// </summary>
        /// <param name="f"></param>
        /// <param name="df"></param>
        /// <param name="value"></param>
        /// <param name="precision"></param>
        /// <returns></returns>
        private static ComplexNumber NewtonIter(FastExpression f, FastExpression df, ComplexNumber value, int precision)
        {
            ComplexNumber prev          = value;
            int           minCheckIters = (int)Math.Sqrt(precision);

            for (int i = 0; i < precision; i++)
            {
                if (i == precision - 1)
                {
                    prev = value.Copy();
                }
                try // TODO: remove try catch in for
                {
                    value -= (f.Substitute(value) / df.Substitute(value)) as ComplexNumber;
                }
                catch (MathSException)
                {
                    throw new MathSException("Two or more variables in SolveNt is forbidden");
                }
                if (i > minCheckIters && prev == value)
                {
                    return(value);
                }
            }
            if (Number.Abs(prev - value) > MathS.Settings.PrecisionErrorCommon)
            {
                return(RealNumber.NaN());
            }
            else
            {
                return(value);
            }
        }
Beispiel #4
0
        public static bool IsRectangleCircleOverlap(Vector rectOrigin, Vector rectSize, Number rectRotation, Vector circleOrigin, Number circleRadius)
        {
            circleOrigin -= rectOrigin;
            if (rectRotation != Number.Zero)
            {
                circleOrigin = Vector.Rotate(Vector.zero, circleOrigin, -rectRotation);
            }

            var corners = GetRectangleVertices(Vector.zero, rectSize, 0);

            circleOrigin.x = Number.Abs(circleOrigin.x);
            circleOrigin.y = Number.Abs(circleOrigin.y);
            var h = corners[1];
            var u = circleOrigin - h;

            if (u.x < 0)
            {
                u.x = 0;
            }
            if (u.y < 0)
            {
                u.y = 0;
            }

            return(Vector.Dot(u, u) <= (circleRadius * circleRadius));
        }
Beispiel #5
0
        public void Test1()
        {
            var x    = MathS.Var("x");
            var expr = x;

            Assert.IsTrue(Number.Abs(expr.DefiniteIntegral(x, 0, 1).Real - 1.0 / 2) < 0.1);
        }
Beispiel #6
0
        public override bool OverlapBox(Vector origin, Vector size, Number rotation)
        {
            if (this.rotation == Number.Zero && rotation == Number.Zero)
            {
                return(Number.Abs(position.x - origin.x) <= (this.size.x + size.x) &&
                       Number.Abs(position.y - origin.y) <= (this.size.y + size.y));
            }
            var rect1 = PhysicsUtils.GetRectangleVertices(position, this.size, this.rotation);
            var rect2 = PhysicsUtils.GetRectangleVertices(origin, size, rotation);

            return(PhysicsUtils.IsRectangleOverlap(rect1, rect2));
        }
        public static decimal CheckRoots(Entity equation, VariableEntity toSub, Entity varValue)
        {
            equation = equation.Substitute(toSub, varValue);
            var allVars = MathS.Utils.GetUniqueVariables(equation);

            foreach (var vr in allVars.FiniteSet())
            {
                equation = equation.Substitute(vr.Name, 3
                                               /* MUST be integer to correspond to integer coefficient of periodic roots*/);
            }

            return(Number.Abs(equation.Eval()));
        }
Beispiel #8
0
        // это нашел только один множитель, нужно короче проверить число на простоту, если не простое,
        // поделить на результат и потом исследовать получившееся, то есть проверить его на простоту и если нужно найти его
        //простой делитель
        public Number RoPolland(Number n)
        {
            Random r      = new Random();
            Number one    = new Number(1);
            var    insert = r.Next(1, (int)n.Value.First());
            Number x      = new Number(insert);
            Number y      = new Number(1);
            ulong  i      = 1;
            ulong  j      = 2;
            Number d      = GreaterCommonDivider(n, Number.Abs(x - y));

            while (d <= one)
            {
                if (i == j)
                {
                    y = x;
                    j = j * 2;
                }
                x = (x * x - one) % n;
                i++;
                d = GreaterCommonDivider(n, Number.Abs(x - y));
            }
            return(d);
        }
        public void AbsTests(double value, double expected)
        {
            Number v = value;

            v.Abs().AssertIsEqualTo(expected);
        }
Beispiel #10
0
 public static Number Abs(Number value)
 {
     return(value.Abs());
 }
Beispiel #11
0
        public void TestMethod1()
        {
            Number n = new Number("-125^6");

            Assert.AreEqual(125, n.Abs());
        }
Beispiel #12
0
        public void TestMethod3()
        {
            Number n = new Number("-2");

            Assert.AreEqual(2, n.Abs());
        }
Beispiel #13
0
        public void TestMethod2()
        {
            Number n = new Number("4");

            Assert.AreEqual(4, n.Abs());
        }
Beispiel #14
0
 public static Number Distance(Number value1, Number value2)
 {
     return(Number.Abs(value1 - value2));
 }