예제 #1
0
파일: Angle.cs 프로젝트: Polymaker/sigen
        public static Angle FromPoints(Vector center, Vector v1, Vector v2)
        {
            var ab = v1 - center;
            var bc = v2 - center;

            return(FromRadians(MathP.Acos(Vector.Dot(ab, bc) / (ab.Length * bc.Length))));
        }
예제 #2
0
파일: FretLine.cs 프로젝트: Polymaker/sigen
        private bool CheckPointsAreStraight(IEnumerable <PointM> points)
        {
            Angle avgAngle = Angle.FromPoints(points.First().ToVector(), points.Last().ToVector());

            avgAngle.Normalize();

            double tolerance = Layout.ShouldHaveStraightFrets() ? 2.5 : 1;

            //double maxDiff = 0;

            for (int i = 1; i < points.Count() - 1; i++)
            {
                var curAngle = Angle.FromPoints(points.First().ToVector(), points.ElementAt(i).ToVector());
                curAngle.Normalize();
                var angleDiff = MathP.Abs(curAngle.Degrees - avgAngle.Degrees);
                if (angleDiff > tolerance)
                {
                    return(false);
                }
                //if (angleDiff > maxDiff)
                //    maxDiff = angleDiff;
            }

            return(true);

            //if (maxDiff >= 1)
            //    Console.WriteLine(string.Format("max diff for fret {0}: {1}", FretIndex, Angle.FromDegrees(maxDiff)));
            //return maxDiff <= tolerance;
        }
예제 #3
0
 internal void SetAim(Vector2 dir, bool useArrow = true)
 {
     aimDirection = dir.normalized;
     if (useArrow)
     {
         hookGameObject.SetActive(true);
         hookGameObject.transform.rotation = MathP.RotationFromDirection(-aimDirection);
         if (aimDirection.x < 0)
         {
             hookHeadRenderer.flipY          = true;
             hookPos.transform.localPosition = new Vector2(hitPosX, -hitPosY);
         }
         else if (aimDirection.x > 0)
         {
             hookHeadRenderer.flipY          = false;
             hookPos.transform.localPosition = new Vector2(hitPosX, hitPosY);
         }
     }
     else
     {
         hookGameObject.SetActive(false);
     }
     if (playerController.isGrounded)
     {
         aimDirection = new Vector2(aimDirection.x, Mathf.Clamp(aimDirection.y, 0, 2));
     }
     if (!lockBackthrowTarget)
     {
         backthrowTarget.localPosition = -aimDirection * hookDistance;
     }
 }
예제 #4
0
    //Construct my unit.
    public Unit GetUnit(WaveUnit wu, Dungeon d)
    {
        //Create our unit to hold the result.
        Unit r = null;

        if (wu.data.unit != null)
        {
            r = Unit.NewUnit(wu.data.unit);
        }
        else
        {
            r = Unit.NewUnit(d.randomUnits[Random.Range(0, d.randomUnits.Count)]);
        }

        //Set equips.
        EquipUnit(ref r, wu, d);

        //Set rank and level.
        int ulevel = 1;

        if (wu.data.level > 0)
        {
            ulevel = wu.data.level - 1;
        }
        else if (level > 0)
        {
            ulevel = level - 1;
        }
        else
        {
            ulevel = d.unitLevel - 1;
        }

        if (wu.data.rank > 0)
        {
            r.rank = wu.data.rank;
        }
        else if (rank > 0)
        {
            r.rank = rank;
        }
        else if (d.unitRank > 0)
        {
            r.rank = d.unitRank;
        }
        else
        {
            r.rank = MathP.GetRank(ulevel);
        }
        r.LevelUp(ulevel);


        //Heal the unit.
        r.cHP = r.GetmHP();

        //Return the result.
        return(r);
    }
예제 #5
0
파일: FretLine.cs 프로젝트: Polymaker/sigen
        private bool CheckForHardBreak(/*IEnumerable<PointM> points*/)
        {
            var points = new List <PointM>();

            for (int i = 0; i < Segments.Count; i++)
            {
                if (i == 0)
                {
                    points.Add(Segments[i].P2);
                }

                points.Add(Segments[i].PointOnString);

                if (i == Segments.Count - 1)
                {
                    points.Add(Segments[i].P1);
                }
            }

            int    straightCtr = 0;
            Vector prevDir     = Vector.Empty;
            Angle  prevAngle   = Angle.Empty;

            for (int i = 0; i < points.Count - 1; i++)
            {
                var curDir   = (points[i + 1] - points[i]).Direction;
                var curAngle = Angle.FromPoints(points[i].ToVector(), points[i + 1].ToVector()).Normalized();
                if (!prevAngle.IsEmpty)
                {
                    if (MathP.Abs(curAngle.Degrees - prevAngle.Degrees) > 25)
                    {
                        //hard break
                        SplitFret(i - 1);
                        return(true);
                    }
                }
                if (!prevDir.IsEmpty)
                {
                    if ((prevDir - curDir).Length <= 0.01)
                    {
                        straightCtr++;
                    }
                }
                prevAngle = curAngle;
                prevDir   = curDir;
            }
            return(false);
        }
예제 #6
0
        public StringLine ConstructString(SIString str, Measure nutPos, Measure bridgePos)
        {
            var     opp = Measure.Abs(nutPos - bridgePos);
            Measure adj = str.ScaleLength;

            if (str.LengthCalculationMethod == LengthFunction.AlongString && opp > Measure.Zero)
            {
                var theta = MathP.Asin(opp.NormalizedValue / str.ScaleLength.NormalizedValue);
                adj = MathP.Cos(theta) * str.ScaleLength;
            }

            var p1 = new PointM(nutPos, (adj / 2d));
            var p2 = new PointM(bridgePos, (adj / 2d) * -1d);

            return(AddVisualElement(new StringLine(str, p1, p2)));
        }
예제 #7
0
        static void Main(string[] args)
        {
            MathP primath = new MathP();

            //Console.WriteLine("- - - - - - -");
            //Console.WriteLine("1. Test if a number is prime");
            //Console.Write("Number to test: ");
            //ulong testNumber = ulong.Parse(Console.ReadLine());
            //Console.WriteLine($"{testNumber} result: {primath.IsPrime(testNumber)}");
            //Console.WriteLine($"collected {primath.GetCached().Count} :: {PrintCollected(primath.GetCached())}");


            //Console.WriteLine("- - - - - - -");
            //Console.WriteLine("2. Number of primes up to a number");
            //Console.Write("Upper bound (inclusive): ");
            //ulong upper = ulong.Parse(Console.ReadLine());
            //Console.WriteLine($"up to {upper} result: {PrintList(primath.PrimesBelow(upper))}");
            //Console.WriteLine($"collected {primath.GetCached().Count} :: {PrintCollected(primath.GetCached())}");

            //Console.WriteLine("- - - - - - -");
            //Console.WriteLine("3. Number of primes in a range");
            //Console.Write("Lower bound: ");
            //ulong lower = ulong.Parse(Console.ReadLine());
            //Console.Write("Upper bound: ");
            //upper = ulong.Parse(Console.ReadLine());
            //Console.WriteLine($"{lower}..{upper} result: {PrintList(primath.PrimesInRange(lower, upper))}");
            //Console.WriteLine($"collected {primath.GetCached().Count} :: {PrintCollected(primath.GetCached())}");

            Console.WriteLine("- - - - - - -");
            Console.WriteLine("4. Factors of a number");
            Console.Write("Number: ");
            ulong target = ulong.Parse(Console.ReadLine());

            Console.WriteLine($"{target} result: {PrintList(primath.Factors(target))}");

            Console.WriteLine("- - - - - - -");
            Console.WriteLine("5. Prime factors of a number");
            Console.Write("Number: ");
            target = ulong.Parse(Console.ReadLine());
            Console.WriteLine($"{target} result: {PrintList(primath.PrimeFactors(target))}");
        }
예제 #8
0
    //Apply status effects.
    public void ApplyStatusEffects(Unit t, AttackData data, float variableValue)
    {
        //For each status effect.
        for (int se = 0; se < statusEffects.Length; se++)
        {
            //Apply elemental advantage.
            float hit = hitRoll;
            if (MathP.IsElementAdavantage(data.actor.uElement, t.uElement) == 1)
            {
                hit /= ELEMPLUS;
            }
            else if (MathP.IsElementAdavantage(data.actor.uElement, t.uElement) == -1)
            {
                hit /= ELEMMINUS;
            }

            //Roll.
            float rand = Random.Range(0, 100);
            if ((rand < statusChances[se] && (hit < ((float)data.actor.GetDEX() / (float)t.GetAGI()) * 100) || !statusEffects[se].isNegative))
            {
                StatusEffect r = StatusEffect.Instantiate(statusEffects[se]);
                if (t == data.actor)
                {
                    r.duration = statusDurations[se] + 1;
                }
                else
                {
                    r.duration = statusDurations[se];
                }
                r.applier       = data.actor;
                r.variableValue = variableValue;
                t.AddStatusEffect(r);
            }
            else if (rand < statusChances[se] && statusEffects[se].isNegative && hit > ((float)data.actor.GetDEX() / (float)t.GetAGI()) * 100)
            {
                t.textQueue.Add("Resist");
                t.textColor.Add(Color.white);
            }
        }
    }
예제 #9
0
 internal void Update()
 {
     currentPos = transform.position;
     dir1       = currentPos - prevPos;
     dir1      *= 10;
     prevPos    = currentPos;
     if (rotateToDirection)
     {
         if (enemyAI.rotateDuringAttack && !enemyAI.doneAttacking)
         {
             transform.rotation = Quaternion.Slerp(transform.rotation, MathP.RotationFromDirection(-dir1), Time.deltaTime * 5f);
         }
         else
         {
             transform.right = rb.velocity;
         }
     }
     else
     {
         transform.rotation = Quaternion.identity;
         RotateGFX(input);
     }
 }
예제 #10
0
        /// <summary>
        /// Calculates the compensated fret positions (takes into account the pitch offset from pressing the string along the fretboard).
        /// </summary>
        /// <param name="properties">The string's physical properties.</param>
        /// <param name="stringLength">The real string length (not the scale length).</param>
        /// <param name="openTuning">The tuning of the open string (not fretted).</param>
        /// <param name="temperament">The temperament to use.</param>
        /// <param name="actionAtFirstFret">Action at the first fret, measured above the fret.</param>
        /// <param name="actionAtTwelfthFret">Action at the twelfth fret, measured above the fret.</param>
        /// <param name="fretHeight">Fret height. Set to zero for fretless.</param>
        /// <param name="numberOfFrets">Number of fret to calculate.</param>
        /// <returns>Returns an array of fret positions (distances from the bridge) starting at fret 0 (nut)</returns>
        public static Measure[] CalculateFretsCompensatedPositions(StringProperties properties, Measure stringLength, PitchValue openTuning, Temperament temperament,
                                                                   Measure actionAtFirstFret, Measure actionAtTwelfthFret, Measure fretHeight, int numberOfFrets)
        {
            var fretPositions      = new PreciseDouble[numberOfFrets + 1]; //+1 to include nut and improve readability (e.g. fretPositions[1] = fret #1 instead of fretPositions[0])
            var frettedLengths     = new PreciseDouble[numberOfFrets + 1]; //+1 to include nut and improve readability (e.g. frettedLengths[1] = fret #1 instead of frettedLengths[0])
            var frettedTensions    = new PreciseDouble[numberOfFrets + 1]; //+1 to include nut and improve readability (e.g. frettedTensions[1] = fret #1 instead of frettedTensions[0])
            var finalFretPositions = new Measure[numberOfFrets + 1];
            var fretHeightIn       = fretHeight[UnitOfMeasure.Inches];
            //Calculate the fret positions
            PreciseDouble flatLength = stringLength[UnitOfMeasure.Inches];

            for (int i = 1; i <= numberOfFrets; i++)//i=1 to skip the nut
            {
                var fretRatio = (PreciseDouble)Math.Pow(2, i / 12d);
                //fretRatio = GetAdjustedFretRatio(openTuning, i, temperament);
                fretPositions[i] = flatLength - (flatLength / fretRatio);
            }

            var gaugeOffset = (properties.StringDiameter / 2d)[UnitOfMeasure.Inches];
            var fret1Action = new Vector(fretPositions[1],
                                         actionAtFirstFret[UnitOfMeasure.Inches] +
                                         fretHeight[UnitOfMeasure.Inches]);

            var fret12Action = new Vector(fretPositions[12],
                                          actionAtTwelfthFret[UnitOfMeasure.Inches] +
                                          fretHeight[UnitOfMeasure.Inches]);

            var actionLineEq   = Line.FromPoints(fret1Action, fret12Action);
            var nutPos         = actionLineEq.GetPointForX(0);
            var saddlePos      = actionLineEq.GetPointForX(flatLength);
            var saddleToNutDir = (nutPos - saddlePos).Normalized;

            frettedLengths[0]     = (nutPos - saddlePos).Length;//actual string length
            finalFretPositions[0] = Measure.Zero;

            PreciseDouble L = frettedLengths[0];                                                                // stringLength[UnitOfMeasure.Inches];
            PreciseDouble f = openTuning.Frequency;                                                             //Frequency, Hz.
            PreciseDouble E = properties.ModulusOfElasticity;                                                   //Modulus of Elasticity, core wire, GPa

            E *= 145038d;                                                                                       //GPa to PSI

            PreciseDouble A   = properties.CoreWireArea != 0 ? properties.CoreWireArea : properties.StringArea; //Area, core wire, in²
            PreciseDouble mul = properties.UnitWeight;                                                          //String mass per unit length, lbs./ inch
            PreciseDouble g   = 386.089;                                                                        //Gravity, 386.089 in./ sec²

            //Calculate the open string tension: T = (mul * (2* L* f )^2) / g
            double T = (mul * Math.Pow((2 * L * f), 2)) / g;

            //Calculate "unstressed" string length: Lor = L / ((T / (E * A)) + 1)
            double Lor = L / ((T / (E * A)) + 1);

            for (int i = 1; i <= numberOfFrets; i++)//i=1 to skip the nut
            {
                var fretFreq    = GetPitchAtFret(openTuning, i, temperament).Frequency;
                var fretTopPos  = new Vector(fretPositions[i], fretHeightIn);
                var prevFretPos = new Vector(fretPositions[i - 1], fretHeightIn);

                if (i == 1)
                {
                    prevFretPos.Y = nutPos.Y;
                }

                var fingerPressPos = new Vector();
                fingerPressPos.X = prevFretPos.X;// (fretTopPos.X + prevFretPos.X) / 2d;
                if (i == 1)
                {
                    fingerPressPos.X = (fretTopPos.X + prevFretPos.X) / 2d;
                }
                fingerPressPos.Y = fretHeightIn;
                //fingerPressPos.Y = PreciseDouble.Max(fretHeightIn - gaugeOffset, gaugeOffset);

                //var fretCenterPos = new Vector(fretPositions[i - 1], i == 1 ? nutPos.Y : fretHeight[UnitOfMeasure.Inches]);

                //Calculate the fretted string length : Ls(n) = The sum of the distances between the top of the fret from the nut and saddle
                //var Lsn = frettedLengths[i] =
                //    (saddlePos - fretTopPos).Length +
                //    (fretTopPos - fingerPressPos).Length +
                //    (fingerPressPos - nutPos).Length;

                var Lsn = frettedLengths[i] =
                    (saddlePos - fretTopPos).Length +
                    (fretTopPos - nutPos).Length;

                //var Lsn = frettedLengths[i] = (nutPos - fretCenterPos).Length + (fretCenterPos - fretTopPos).Length + (fretTopPos - saddlePos).Length;

                //Calculate the fretted string tension : Ts(n) = ((Lsn - Lor) / Lor) * E * A
                var Tsn = frettedTensions[i] = ((Lsn - Lor) / Lor) * E * A;
                //Calculate fret compensated position: Lfret(n) = SQRT((g * Tsn )/ mul ) / (2 * fn )

                var Lfretn = MathP.Sqrt((g * Tsn) / mul) / (2d * fretFreq);

                //var opp = saddlePos.Y - fretHeightIn;
                //var theta = MathP.Asin(opp / Lfretn);
                //var fretDist = MathP.Cos(theta) * Lfretn;
                //var pos2D = saddlePos + (saddleToNutDir * Lfretn);
                //var testPos = flatLength - fretDist;

                var finalPos = flatLength - Lfretn;
                fretPositions[i]      = finalPos;
                finalFretPositions[i] = Measure.Inches(finalPos);
            }


            return(finalFretPositions);
        }
예제 #11
0
파일: Measure.cs 프로젝트: Polymaker/sigen
        public string ToString(MeasureFormat format)
        {
            if (IsEmpty)
            {
                return("N/A");
            }

            var usedUnit = format.OverrideUnit ?? Unit;

            string digitFormat = string.Empty;

            if (format.MinimumDecimals > 0 || format.MaximumDecimals > 0)
            {
                digitFormat = ":0.";
            }

            if (format.MinimumDecimals > 0)
            {
                digitFormat = digitFormat.PadRight(3 + format.MinimumDecimals, '0');
            }
            if (format.MaximumDecimals > 0)
            {
                digitFormat = digitFormat.PadRight(3 + format.MaximumDecimals, '#');
            }

            if (usedUnit == null)
            {
                return(string.Format("{0" + digitFormat + "}", Value));
            }

            var displayedUnit = format.ShowUnitOfMeasure ? usedUnit.Symbol : string.Empty;

            const double sixtyfourth = 0.015625d;

            if (usedUnit == UnitOfMeasure.Inches && format.ShowFractions)
            {
                var value  = this[usedUnit];
                int whole  = (int)MathP.Floor(value);
                var remain = value - whole;

                if (remain >= sixtyfourth && remain + sixtyfourth < 1d)
                {
                    int sixtyFourCount = 0;
                    while (remain >= sixtyfourth || Math.Abs(remain - sixtyfourth) < 0.000001)
                    {
                        sixtyFourCount++;
                        remain -= sixtyfourth;
                    }
                    int baseFrac = 64;
                    while ((sixtyFourCount / 2d) % 2d == 0d || (sixtyFourCount / 2d) % 2d == 1d)
                    {
                        baseFrac       /= 2;
                        sixtyFourCount /= 2;
                    }

                    if ((whole > 0 || remain > sixtyfourth / 2) && (format.AllowApproximation || remain < 0.002))
                    {
                        if (whole == 0)
                        {
                            return(string.Format("{3}{0}/{1}{2}", sixtyFourCount, baseFrac, displayedUnit, remain > 0.002 ? "~" : string.Empty));
                        }
                        else
                        {
                            return(string.Format("{0} {4}{1}/{2}{3}", whole, sixtyFourCount, baseFrac, displayedUnit, remain > 0.002 ? "~" : string.Empty));
                        }
                    }
                }
                else if (remain > 0.002 && remain < sixtyfourth && whole > 0 && format.AllowApproximation)
                {
                    return(string.Format("~{0}{1}", whole, displayedUnit));
                }
            }
            else if (usedUnit == UnitOfMeasure.Feets && format.ShowFractions)
            {
                var value  = this[usedUnit];
                int whole  = (int)MathP.Floor(value);
                var remain = value - whole;
                if (remain >= sixtyfourth / 12d && format.ShowUnitOfMeasure)
                {
                    return(string.Format("{0}{1} {2}", whole, usedUnit.Symbol, Inches(remain * 12d).ToString(format.Clone())));
                }
                else if (whole > 0 && remain > 0 && remain < sixtyfourth / 12d && format.AllowApproximation)
                {
                    return(string.Format("~{0}{1}", whole, displayedUnit));
                }
            }

            return(string.Format("{0" + digitFormat + "}{1}", this[usedUnit], displayedUnit));
        }
예제 #12
0
파일: Angle.cs 프로젝트: Polymaker/sigen
        public static Angle FromDirectionVector(Vector vec)
        {
            var dirVec = vec.Length == 1 ? vec : vec.Normalized;

            return(FromRadians(MathP.Atan2(dirVec.Y, dirVec.X)));
        }
예제 #13
0
파일: Angle.cs 프로젝트: Polymaker/sigen
        public static Angle FromPoints(Vector v1, Vector v2)
        {
            var dirVec = (v2 - v1).Normalized;

            return(FromRadians(MathP.Atan2(dirVec.Y, dirVec.X)));
        }
예제 #14
0
파일: Angle.cs 프로젝트: Polymaker/sigen
 public static bool operator ==(Angle a1, Angle a2)
 {
     return(MathP.Abs(a1.Degrees - a2.Degrees) <= double.Epsilon);
 }
예제 #15
0
 public static Vector FromAngle(Angle angle)
 {
     return(new Vector(MathP.Cos(angle.Radians), MathP.Sin(angle.Radians)));
 }
예제 #16
0
    //Make a single attack.
    public long AttackTarget(Unit actor, Unit target, AttackData data, bool isCrit, float dmgMod)
    {
        //If we crit, apply that.
        float critmod = 1f;

        if (isCrit)
        {
            critmod = actor.GetCritDMG();
        }

        //Apply elemental advantage.
        float hit = hitRoll;

        if (MathP.IsElementAdavantage(actor.uElement, target.uElement) == 1)
        {
            hit /= ELEMPLUS;
        }
        else if (MathP.IsElementAdavantage(actor.uElement, target.uElement) == -1)
        {
            hit /= ELEMMINUS;
        }

        //Check if we miss.
        if (hit < ((float)actor.GetDEX() / (float)target.GetAGI()) * 100)
        {
            //Roll for damage.
            float rowMod = 1;
            if (data.actorParty.GetAllUnits().Contains(target))
            {
                rowMod = data.actorParty.GetRowDamageMod(target);
            }
            else if (data.defendingParty.GetAllUnits().Contains(target))
            {
                rowMod = data.defendingParty.GetRowDamageMod(target);
            }
            long d = MathP.GetDamage((decimal)(GetSkillDamage(actor) * dmgMod), target.GetStat(defenseStat));
            d = (long)(Mathf.CeilToInt(d * rowMod));

            //Apply elemental advantage.
            if (MathP.IsElementAdavantage(actor.uElement, target.uElement) == 1)
            {
                d = (long)(d * ELEMPLUS);
            }
            else if (MathP.IsElementAdavantage(actor.uElement, target.uElement) == -1)
            {
                d = (long)(d * ELEMMINUS);
            }

            //Deal the damage.
            if (target.myStatusEffects.Find(n => n.isCover) == null)
            {
                target.TakeHit(d, false, critmod, MathP.IsElementAdavantage(actor.uElement, target.uElement));
            }
            else
            {
                //Get how much damage is diverted.
                for (int i = 0; i < target.myStatusEffects.Count; i++)
                {
                    long diverted = 0;
                    if (target.myStatusEffects[i].isCover && target.myStatusEffects[i].applier != null)
                    {
                        diverted += (long)((target.myStatusEffects[i].variableValue / 100) * (float)d);
                        Debug.Log("Yes");
                        //If the diverter is still alive and stuff.
                        if (target.myStatusEffects[i].applier.IsAlive())
                        {
                            target.myStatusEffects[i].applier.TakeHit(diverted, false, 1f);
                            d -= diverted;
                        }
                    }
                }

                //Finally, deal remaining damage to the target.
                target.TakeHit(d, false, critmod, MathP.IsElementAdavantage(actor.uElement, target.uElement));
            }

            //Take any thorns damage.
            if (target.GetThorns(Mathf.CeilToInt((long)(d * critmod))) > 0)
            {
                actor.TakeHit(target.GetThorns(Mathf.CeilToInt((long)(d * critmod))), false, 1f);
            }
            return(d);
        }
        else
        {
            target.TakeMiss();
            return(-1);
        }
    }
예제 #17
0
 /// <summary>
 /// Returns the fret position as the distance from the bridge.
 /// </summary>
 /// <param name="fret"></param>
 /// <returns></returns>
 public static PreciseDouble GetEqualTemperedFretPosition(int fret)
 {
     return((PreciseDouble)1d / MathP.Pow(2, fret / 12d));
 }