예제 #1
0
    public subNode sub()
    {
        var token = lexer.GetToken();

        if (token.Id == 3 || token.Id == 2)
        {
            var text = "";
            var arg0 = mul();
            text += arg0.Text;
            var arg1 = sub2();
            text += arg1.Text;
            var result = new subNode(text, null, arg0, arg1);
            result.mul  = arg0;
            result.sub2 = arg1;
            result.res  = result.sub2.res.Sub(result.mul.res);
            token       = lexer.GetToken();
            if (token.Id != -1 && token.Id != 4)
            {
                throw new ParserException("Got unxpected token from lexer");
            }
            return(result);
        }
        throw new ParserException("Got unxpected token from lexer");
        //return null
    }
예제 #2
0
        public void Parametrize(int fromSegmentIndex, int toSegmentIndex)
        {
            if (nodes.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++)
            {
                subNode[] subKnots = GetSegmentSubKnots(i);
                for (int j = 0; j < subKnots.Length; j++)
                {
                    subNode sk = new subNode();

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

                    subKnots[j] = sk;
                }

                nodes[FirstSegmentKnotIndex + i].distanceFromStart = totalDistance;
            }
        }
예제 #3
0
        public bool PlaceMarker(Marker result, float distance, Marker from = null)
        {
            subNode[] subNodes;
            int       nbSegments = NbSegments;

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


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

            int fromSegmentIndex = 0;
            int fromSubKnotIndex = 1;

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

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

                subNodes = GetSegmentSubKnots(i);

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

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

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

                    break;
                }

                break;
            }

            return(true);
        }