/// <summary> /// Travels some distance on beizer and calculates the point and tangent at that distance. /// </summary> /// <param name="distance">distance to travel on the arc in meteres</param> /// <param name="tangent">normalized tangent on the curve toward the end of the beizer.</param> /// <returns>point on the curve at the given distance.</returns> public static Vector2 Travel2(this Bezier2 beizer, float distance, out Vector2 tangent) { if (beizer.IsStraight()) { tangent = (beizer.d - beizer.a).normalized; return(beizer.TravelStraight(distance)); } float t = beizer.Travel(0, distance); tangent = beizer.Tangent(t).normalized; return(beizer.Position(t)); }
public static float ArcLength(this Bezier2 bezier, float step = 0.1f) { if (bezier.IsStraight()) { return((bezier.d - bezier.a).magnitude); } float ret = 0; float t; for (t = step; t < 1f; t += step) { float len = (bezier.Position(t) - bezier.Position(t - step)).magnitude; ret += len; } { float len = (bezier.d - bezier.Position(t - step)).magnitude; ret += len; } return(ret); }
public static float ArcLength(this Bezier2 bezier, Vector2 point, float step = 0.1f) { if (bezier.IsStraight()) { return((point - bezier.a).magnitude); } float ret = 0; float t; for (t = step; t <= 1f + Epsilon; t += step) { var p0 = bezier.Position(t - step); float len = (bezier.Position(t) - p0).magnitude; float len2 = (point - p0).magnitude; if (len2 <= len + Epsilon) { ret += len2; return(ret); } ret += len; } return(ret); }