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