Ejemplo n.º 1
0
    public NormalizedPointCurve(IPointCurve m_originalCurve)
    {
        this.m_originalCurve = m_originalCurve;

        float totalLength   = 0f;
        float pointIndexToT = 1f / c_approximationPointsCount;

        float t      = 0f;
        Point pointB = m_originalCurve.Evaluate(0);
        Point pointA;
//		Debug.Log ("begin");
        FloatSpline tNormalizerInv = new FloatSpline();

        for (int i = 1; i <= c_approximationPointsCount; i++)
        {
            t = i * pointIndexToT;

            pointA = pointB;
            pointB = m_originalCurve.Evaluate(t);

            float distanceBetweenPoints = Vector3.Distance(pointA.position, pointB.position);

            float newTotalLength = totalLength + distanceBetweenPoints;
            tNormalizerInv.curves.Add(new LinearFloatCurve(totalLength, newTotalLength));
            totalLength = newTotalLength;
//			Debug.Log (totalLength);
        }
        float totalLengthInv = 1f / totalLength;

//		float lastB = 0f;
        foreach (LinearFloatCurve linearCurve in tNormalizerInv.curves)
        {
            linearCurve.a *= totalLengthInv;
            linearCurve.b *= totalLengthInv;
//			lastB = linearCurve.b;
        }
        var tNormalizerValues = new float[c_approximationPointsCount + 1];

        for (int i = 0; i < tNormalizerValues.Length; i++)
        {
            tNormalizerValues [i] = FloatSplineMath.FindClosest(tNormalizerInv, i * pointIndexToT);
//			lastB = tNormalizerValues [i];
        }

        FloatSpline tNormalizer = new FloatSpline();

        for (int i = 0; i < tNormalizerValues.Length - 1; i++)
        {
            float valA        = tNormalizerValues [i];
            float valB        = tNormalizerValues [i + 1];
            var   linearCurve = new LinearFloatCurve(valA, valB);
//			lastB = linearCurve.b;
            tNormalizer.curves.Add(linearCurve);
        }
//		Debug.Log (lastB);

        m_tNormalizer = tNormalizer;
    }
Ejemplo n.º 2
0
            public Spline addNewSpline(ETARGET_TYPE targetType, ESPLINE_TYPE splineType)
            {
                switch (splineType)
                {
                case ESPLINE_TYPE.INT_SPLINE:
                {
                    IntSpline spline = new IntSpline(targetType);
                    m_splines.Add(spline);
                    return(spline);
                }

                case ESPLINE_TYPE.FLOAT_SPLINE:
                {
                    FloatSpline spline = new FloatSpline(targetType);
                    m_splines.Add(spline);
                    return(spline);
                }

                default: return(null);
                }
            }
Ejemplo n.º 3
0
    public static float FindClosest(FloatSpline sameDerivativeSignSpline, float targetValue)
    {
        float stepSize = 0.5f;
        float result   = 0.5f;

        for (int i = 0; i < c_iterationsCount; i++)
        {
            float left   = result - stepSize;
            float middle = result;
            float right  = result + stepSize;

            float leftValue   = sameDerivativeSignSpline.Evaluate(left);
            float middleValue = sameDerivativeSignSpline.Evaluate(middle);
            float rightValue  = sameDerivativeSignSpline.Evaluate(right);

            float leftError   = Mathf.Abs(targetValue - leftValue);
            float middleError = Mathf.Abs(targetValue - middleValue);
            float rightError  = Mathf.Abs(targetValue - rightValue);

            if (middleError <= leftError && middleError <= rightError)
            {
                result = middle;
            }
            else
            {
                if (leftError <= rightError)
                {
                    result = left;
                }
                else
                {
                    result = right;
                }
            }
            stepSize *= 0.5f;
        }
        result = Mathf.Clamp01(result);
        return(result);
    }
Ejemplo n.º 4
0
            public Spline addNewSpline(ETARGET_TYPE targetType, ESPLINE_TYPE splineType)
            {
                switch (splineType) {
                    case ESPLINE_TYPE.INT_SPLINE:
                    {      
                        IntSpline spline = new IntSpline(targetType);
                        m_splines.Add(spline);
                        return spline;
                    }

                    case ESPLINE_TYPE.FLOAT_SPLINE:
                    {
                        FloatSpline spline = new FloatSpline(targetType);
                        m_splines.Add(spline);
                        return spline;
                    }

                    default: return null;
                }
            }