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