private protected (_CurveNode <T> A, _CurveNode <T> B, float Amount) FindSample(float offset) { if (_Keys.Count == 0) { return(default(_CurveNode <T>), default(_CurveNode <T>), 0); } var(keyA, keyB, amount) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset); return(_Keys[keyA], _Keys[keyB], amount); }
/// <summary> /// Sets the outgoing tangent to an existing point. /// </summary> /// <param name="offset">The offset of the existing point.</param> /// <param name="tangent">The tangent value.</param> public void SetOutgoingTangent(float offset, T tangent) { Guard.IsTrue(_Keys.ContainsKey(offset), nameof(offset)); tangent = CloneValue(tangent); var(keyA, keyB, _) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset); if (keyA == keyB) { var a = _Keys[keyA]; a.Degree = 3; a.OutgoingTangent = tangent; _Keys[keyA] = a; } else { var a = _Keys[keyA]; var b = _Keys[keyB]; if (keyA != keyB) { if (a.Degree == 1) { b.IncomingTangent = GetTangent(a.Point, b.Point); } _Keys[keyB] = b; } a.Degree = 3; a.OutgoingTangent = tangent; _Keys[keyA] = a; } }
/// <summary> /// Sets the incoming tangent to an existing point. /// </summary> /// <param name="offset">The offset of the existing point.</param> /// <param name="tangent">The tangent value.</param> public void SetIncomingTangent(float offset, T tangent) { Guard.IsTrue(_Keys.ContainsKey(offset), nameof(offset)); offset -= float.Epsilon; var(keyA, keyB, _) = CurveSampler.FindRangeContainingOffset(_Keys.Keys, offset); var a = _Keys[keyA]; var b = _Keys[keyB]; if (a.Degree == 1) { a.OutgoingTangent = GetTangent(a.Point, b.Point); } a.Degree = 3; b.IncomingTangent = tangent; _Keys[keyA] = a; _Keys[keyB] = b; }
public override Vector3 GetPoint(Single offset) { var sample = FindSample(offset); switch (sample.A.Degree) { case 0: return(sample.A.Point); case 1: return(Vector3.Lerp(sample.A.Point, sample.B.Point, sample.Amount)); case 3: return(CurveSampler.InterpolateCubic ( sample.A.Point, sample.A.OutgoingTangent, sample.B.Point, sample.B.IncomingTangent, sample.Amount )); default: throw new NotSupportedException(); } }
protected override Vector3 GetTangent(Vector3 fromValue, Vector3 toValue) { return(CurveSampler.CreateTangent(fromValue, toValue)); }
protected override Quaternion GetTangent(Quaternion fromValue, Quaternion toValue) { return(CurveSampler.CreateTangent(fromValue, toValue)); }
protected override SEGMENT GetTangent(SEGMENT fromValue, SEGMENT toValue) { return(new SEGMENT(CurveSampler.Subtract(toValue, fromValue))); }
public SEGMENT InterpolateCubic(SEGMENT start, SEGMENT outgoingTangent, SEGMENT end, SEGMENT incomingTangent, Single amount) { return(new SEGMENT(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount))); }
public SEGMENT InterpolateLinear(SEGMENT left, SEGMENT right, float amount) { return(new SEGMENT(CurveSampler.InterpolateLinear(left, right, amount))); }
public float[] InterpolateCubic(float[] start, float[] outgoingTangent, float[] end, float[] incomingTangent, float amount) { return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount)); }
public float[] InterpolateLinear(float[] left, float[] right, float amount) { return(CurveSampler.InterpolateLinear(left, right, amount)); }
public Quaternion InterpolateCubic(Quaternion start, Quaternion outgoingTangent, Quaternion end, Quaternion incomingTangent, Single amount) { return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount)); }
public Vector3 InterpolateCubic(Vector3 start, Vector3 outgoingTangent, Vector3 end, Vector3 incomingTangent, Single amount) { return(CurveSampler.InterpolateCubic(start, outgoingTangent, end, incomingTangent, amount)); }