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 }
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; } }
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); }