Esempio n. 1
0
        public Vector3 GetSplinePoint(float tX, float tY)
        {
            int iX  = (int)(tX * ControlSizeX);
            int i0X = Mathf.Max(0, iX - 1);
            int i1X = Mathf.Min(iX, ControlSizeX - 1);
            int i2X = Mathf.Min(iX + 1, ControlSizeX - 1);

            int iY  = (int)(tY * ControlSizeY);
            int i0Y = Mathf.Max(0, iY - 1);
            int i1Y = Mathf.Min(iY, ControlSizeY - 1);
            int i2Y = Mathf.Min(iY + 1, ControlSizeY - 1);

            var p00 = GetControl(i0X, i0Y);
            var p10 = GetControl(i1X, i0Y);
            var p20 = GetControl(i2X, i0Y);

            var p01 = GetControl(i0X, i1Y);
            var p11 = GetControl(i1X, i1Y);
            var p21 = GetControl(i2X, i1Y);

            var p02 = GetControl(i0X, i2Y);
            var p12 = GetControl(i1X, i2Y);
            var p22 = GetControl(i2X, i2Y);

            var cPoint10 = (p00 + p10) * 0.5f;
            var cPoint20 = (p10 + p20) * 0.5f;

            var cPoint11 = (p01 + p11) * 0.5f;
            var cPoint21 = (p11 + p21) * 0.5f;

            var cPoint12 = (p02 + p12) * 0.5f;
            var cPoint22 = (p12 + p22) * 0.5f;

            float tStepX   = 1.0f / ControlSizeX;
            float localTx  = (tX % tStepX) * ControlSizeX;
            var   resultX0 = CurveUtils.GetBezierPoint(cPoint10, p10, cPoint20, localTx);
            var   resultX1 = CurveUtils.GetBezierPoint(cPoint11, p11, cPoint21, localTx);
            var   resultX2 = CurveUtils.GetBezierPoint(cPoint12, p12, cPoint22, localTx);

            var cPoint1Y = (resultX0 + resultX1) * 0.5f;
            var cPoint2Y = (resultX2 + resultX1) * 0.5f;

            float tStepY  = 1.0f / ControlSizeY;
            float localTy = (tY % tStepY) * ControlSizeY;

            return(CurveUtils.GetBezierPoint(cPoint1Y, resultX1, cPoint2Y, localTy));
        }