示例#1
0
        public TSVector2 GetPosition(FP time)
        {
            bool flag = this.ControlPoints.Count < 2;

            if (flag)
            {
                throw new Exception("You need at least 2 control points to calculate a position.");
            }
            bool      closed = this.Closed;
            TSVector2 result;

            if (closed)
            {
                this.Add(this.ControlPoints[0]);
                this._deltaT = 1f / (float)(this.ControlPoints.Count - 1);
                int  num   = (int)((long)(time / this._deltaT));
                int  num2  = num - 1;
                bool flag2 = num2 < 0;
                if (flag2)
                {
                    num2 += this.ControlPoints.Count - 1;
                }
                else
                {
                    bool flag3 = num2 >= this.ControlPoints.Count - 1;
                    if (flag3)
                    {
                        num2 -= this.ControlPoints.Count - 1;
                    }
                }
                int  num3  = num;
                bool flag4 = num3 < 0;
                if (flag4)
                {
                    num3 += this.ControlPoints.Count - 1;
                }
                else
                {
                    bool flag5 = num3 >= this.ControlPoints.Count - 1;
                    if (flag5)
                    {
                        num3 -= this.ControlPoints.Count - 1;
                    }
                }
                int  num4  = num + 1;
                bool flag6 = num4 < 0;
                if (flag6)
                {
                    num4 += this.ControlPoints.Count - 1;
                }
                else
                {
                    bool flag7 = num4 >= this.ControlPoints.Count - 1;
                    if (flag7)
                    {
                        num4 -= this.ControlPoints.Count - 1;
                    }
                }
                int  num5  = num + 2;
                bool flag8 = num5 < 0;
                if (flag8)
                {
                    num5 += this.ControlPoints.Count - 1;
                }
                else
                {
                    bool flag9 = num5 >= this.ControlPoints.Count - 1;
                    if (flag9)
                    {
                        num5 -= this.ControlPoints.Count - 1;
                    }
                }
                FP amount = (time - this._deltaT * num) / this._deltaT;
                result = TSVector2.CatmullRom(this.ControlPoints[num2], this.ControlPoints[num3], this.ControlPoints[num4], this.ControlPoints[num5], amount);
                this.RemoveAt(this.ControlPoints.Count - 1);
            }
            else
            {
                int  num6   = (int)((long)(time / this._deltaT));
                int  num7   = num6 - 1;
                bool flag10 = num7 < 0;
                if (flag10)
                {
                    num7 = 0;
                }
                else
                {
                    bool flag11 = num7 >= this.ControlPoints.Count - 1;
                    if (flag11)
                    {
                        num7 = this.ControlPoints.Count - 1;
                    }
                }
                int  num8   = num6;
                bool flag12 = num8 < 0;
                if (flag12)
                {
                    num8 = 0;
                }
                else
                {
                    bool flag13 = num8 >= this.ControlPoints.Count - 1;
                    if (flag13)
                    {
                        num8 = this.ControlPoints.Count - 1;
                    }
                }
                int  num9   = num6 + 1;
                bool flag14 = num9 < 0;
                if (flag14)
                {
                    num9 = 0;
                }
                else
                {
                    bool flag15 = num9 >= this.ControlPoints.Count - 1;
                    if (flag15)
                    {
                        num9 = this.ControlPoints.Count - 1;
                    }
                }
                int  num10  = num6 + 2;
                bool flag16 = num10 < 0;
                if (flag16)
                {
                    num10 = 0;
                }
                else
                {
                    bool flag17 = num10 >= this.ControlPoints.Count - 1;
                    if (flag17)
                    {
                        num10 = this.ControlPoints.Count - 1;
                    }
                }
                FP amount2 = (time - this._deltaT * num6) / this._deltaT;
                result = TSVector2.CatmullRom(this.ControlPoints[num7], this.ControlPoints[num8], this.ControlPoints[num9], this.ControlPoints[num10], amount2);
            }
            return(result);
        }
示例#2
0
        public TSVector2 GetPosition(FP time)
        {
            TSVector2 temp;

            if (ControlPoints.Count < 2)
            {
                throw new Exception("You need at least 2 control points to calculate a position.");
            }

            if (Closed)
            {
                Add(ControlPoints[0]);

                _deltaT = 1f / (ControlPoints.Count - 1);

                int p = (int)(time / _deltaT);

                // use a circular indexing system
                int p0 = p - 1;
                if (p0 < 0)
                {
                    p0 = p0 + (ControlPoints.Count - 1);
                }
                else if (p0 >= ControlPoints.Count - 1)
                {
                    p0 = p0 - (ControlPoints.Count - 1);
                }
                int p1 = p;
                if (p1 < 0)
                {
                    p1 = p1 + (ControlPoints.Count - 1);
                }
                else if (p1 >= ControlPoints.Count - 1)
                {
                    p1 = p1 - (ControlPoints.Count - 1);
                }
                int p2 = p + 1;
                if (p2 < 0)
                {
                    p2 = p2 + (ControlPoints.Count - 1);
                }
                else if (p2 >= ControlPoints.Count - 1)
                {
                    p2 = p2 - (ControlPoints.Count - 1);
                }
                int p3 = p + 2;
                if (p3 < 0)
                {
                    p3 = p3 + (ControlPoints.Count - 1);
                }
                else if (p3 >= ControlPoints.Count - 1)
                {
                    p3 = p3 - (ControlPoints.Count - 1);
                }

                // relative time
                FP lt = (time - _deltaT * p) / _deltaT;

                temp = TSVector2.CatmullRom(ControlPoints[p0], ControlPoints[p1], ControlPoints[p2], ControlPoints[p3], lt);

                RemoveAt(ControlPoints.Count - 1);
            }
            else
            {
                int p = (int)(time / _deltaT);

                //
                int p0 = p - 1;
                if (p0 < 0)
                {
                    p0 = 0;
                }
                else if (p0 >= ControlPoints.Count - 1)
                {
                    p0 = ControlPoints.Count - 1;
                }
                int p1 = p;
                if (p1 < 0)
                {
                    p1 = 0;
                }
                else if (p1 >= ControlPoints.Count - 1)
                {
                    p1 = ControlPoints.Count - 1;
                }
                int p2 = p + 1;
                if (p2 < 0)
                {
                    p2 = 0;
                }
                else if (p2 >= ControlPoints.Count - 1)
                {
                    p2 = ControlPoints.Count - 1;
                }
                int p3 = p + 2;
                if (p3 < 0)
                {
                    p3 = 0;
                }
                else if (p3 >= ControlPoints.Count - 1)
                {
                    p3 = ControlPoints.Count - 1;
                }

                // relative time
                FP lt = (time - _deltaT * p) / _deltaT;

                temp = TSVector2.CatmullRom(ControlPoints[p0], ControlPoints[p1], ControlPoints[p2], ControlPoints[p3], lt);
            }

            return(temp);
        }