public void Parametrize(int fromSegmentIndex, int toSegmentIndex)
    {
        if (knots.Count < MinimumKnotNb)
        {
            return;
        }

        int nbSegments = System.Math.Min(toSegmentIndex + 1, NbSegments);

        fromSegmentIndex = System.Math.Max(0, fromSegmentIndex);
        float totalDistance = 0;

        if (fromSegmentIndex > 0)
        {
            totalDistance = GetSegmentDistanceFromStart(fromSegmentIndex - 1);
        }

        for (int i = fromSegmentIndex; i < nbSegments; i++)
        {
            /*if(IsSegmentValid(i) && !force)
             * {
             *      totalDistance = GetSegmentDistanceFromStart(i);
             *      continue;
             * }*/

            SubKnot[] subKnots = GetSegmentSubKnots(i);

            for (int j = 0; j < subKnots.Length; j++)
            {
                SubKnot sk = new SubKnot();

                sk.distanceFromStart = totalDistance += ComputeLengthOfSegment(i, (j - 1) * Epsilon, j * Epsilon);
                sk.position          = GetPositionOnSegment(i, j * Epsilon);
                sk.tangent           = GetTangentOnSegment(i, j * Epsilon);
                sk.height            = GetHeightOnSegment(i, j * Epsilon);

                subKnots[j] = sk;
            }

            knots[FirstSegmentKnotIndex + i].distanceFromStart = totalDistance;
        }
    }
Beispiel #2
0
    public bool PlaceMarker(Marker result, float distance, Marker from = null)
    {
        //result = new Marker();
        SubKnot[] subKnots;
        int       nbSegments = NbSegments;

        if (nbSegments == 0)
        {
            return(false);
        }

        //Parametrize();

        if (distance <= 0)
        {
            result.segmentIndex  = 0;
            result.subKnotAIndex = 0;
            result.subKnotBIndex = 1;
            result.lerpRatio     = 0f;
            return(true);
        }
        else if (distance >= Length())
        {
            subKnots             = GetSegmentSubKnots(nbSegments - 1);
            result.segmentIndex  = nbSegments - 1;
            result.subKnotAIndex = subKnots.Length - 2;
            result.subKnotBIndex = subKnots.Length - 1;
            result.lerpRatio     = 1f;
            return(true);
        }

        int fromSegmentIndex = 0;
        int fromSubKnotIndex = 1;

        if (from != null)
        {
            fromSegmentIndex = from.segmentIndex;
            //fromSubKnotIndex = from.subKnotAIndex;
        }

        for (int i = fromSegmentIndex; i < nbSegments; i++)
        {
            if (distance > GetSegmentDistanceFromStart(i))
            {
                continue;
            }

            subKnots = GetSegmentSubKnots(i);

            for (int j = fromSubKnotIndex; j < subKnots.Length; j++)
            {
                SubKnot sk = subKnots[j];

                if (distance > sk.distanceFromStart)
                {
                    continue;
                }

                result.segmentIndex  = i;
                result.subKnotAIndex = j - 1;
                result.subKnotBIndex = j;
                result.lerpRatio     = 1f - ((sk.distanceFromStart - distance) /
                                             (sk.distanceFromStart - subKnots[j - 1].distanceFromStart));

                break;
            }

            break;
        }

        return(true);
    }
Beispiel #3
0
    public void Parametrize(int fromSegmentIndex, int toSegmentIndex)
    {
        if (knots.Count < MinimumKnotNb)
            return;

        int nbSegments = System.Math.Min (toSegmentIndex + 1, NbSegments);
        fromSegmentIndex = System.Math.Max (0, fromSegmentIndex);
        float totalDistance = 0;

        if (fromSegmentIndex > 0) {
            totalDistance = GetSegmentDistanceFromStart (fromSegmentIndex - 1);
        }

        for (int i=fromSegmentIndex; i<nbSegments; i++) {
            /*if(IsSegmentValid(i) && !force)
            {
                totalDistance = GetSegmentDistanceFromStart(i);
                continue;
            }*/

            SubKnot[] subKnots = GetSegmentSubKnots (i);

            for (int j=0; j<subKnots.Length; j++) {
                SubKnot sk = new SubKnot ();

                sk.distanceFromStart = totalDistance += ComputeLengthOfSegment (i, (j - 1) * Epsilon, j * Epsilon);
                sk.position = GetPositionOnSegment (i, j * Epsilon);
                sk.tangent = GetTangentOnSegment (i, j * Epsilon);

                subKnots [j] = sk;
            }

            knots [FirstSegmentKnotIndex + i].distanceFromStart = totalDistance;
        }
    }