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