void Update() { switch ((int)tweenType) { case (int)enCurveEquation.ArchimedeanSpiral: transform.position = CurveEquation.ArchimedeanSpiral(nowTime * _time, 使用蚊香曲线?蚊香曲线.Evaluate(nowTime) * 蚊香半径:蚊香半径); break; case (int)enCurveEquation.Parabola: //Arg1 趋于0 则抛物线趋于平行线 transform.position = CurveEquation.Parabola(2 * nowTime * _time - _time, 焦准距); break; case (int)enCurveEquation.Sinusoid: transform.position = CurveEquation.Sinusoid(nowTime, 振幅, 偏距, 角速度, 初相); break; case (int)enCurveEquation.Cardioid: transform.position = CurveEquation.Cardioid(nowTime * _time, 心形半径, 花瓣数); break; case (int)enCurveEquation.Damping: transform.position = CurveEquation.Damping(nowTime * _time, 阻尼振幅, 阻尼衰减度, 阻尼频率); break; } DebugLine.Instance.AddLine(transform.position); }
private static Point SplitByNextIntersection(Point startPoint, SegmentBase segment, out SegmentBase segment1, out SegmentBase segment2, CurveEquation equation, Func <double, Point, SegmentBase> factory1, Func <double, SegmentBase> factory2) { var intersection = segment.Intersections.Select(x => new { Point = x, T = equation.GetT(x) }).MinBy(x => x.T); var t = Math.Min(Math.Max(intersection.T, 0), 1); var point = equation.GetPoint(t); segment1 = point == startPoint ? null : factory1(t, intersection.Point); if (point == segment.EndPoint) { segment2 = null; Debugger.BreakWhen(segment.Intersections.Count > 1); } else { segment2 = factory2(t); segment2.Intersections.AddRange(segment.Intersections.Where(x => x != intersection.Point)); } return(intersection.Point); }
public Curve(CurveEquation equation) { _equation = equation; }