public static List <Vector2> ElectricFieldLineFast(IEnumerable <PhysicalObject> system, Vector2 initPos, Func <float, Vector2, bool> endFunc, bool startFromNegative, float delta = 1e-3f) { Vector2 f(float t, Vector2 v) { var e = PSystem.GetElectricFieldAt(system, v); return(e / e.Length() * 100f); } var result = new List <Vector2>(); float num1 = 0f; result.Add(initPos); while (!endFunc(num1, result.Last()) || Single.IsNaN(result.Last().X)) { var vec = f(num1, initPos); result.Add(initPos + delta * vec); if (TryFindMatch( system, (p) => p.Charge != 0 && DistFromPointToSegment(result[result.Count - 2], result.Last(), p.Position) < 0.1f, out PhysicalObject obj)) { result.RemoveAt(result.Count - 1); result.Add(obj.Position); break; } num1 += delta; initPos = result.Last(); } return(result); }