Exemple #1
0
        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);
        }