Example #1
0
        public static Particula operator +(Particula a, Particula b)
        {
            //Suponemos que es un choque inelastico, y que no hay transformacion de masa en energia
            double[] p = new double[a.posicion.Length];
            for (int i = 0; i < p.Length; i++)
            {
                p[i] = (a.posicion[i] + b.posicion[i]) / 2;
            }

            double[] velocidad = new double[a.velocidad.Length];
            for (int i = 0; i < velocidad.Length; i++)
            {
                velocidad[i] = (a.cmovimiento[i] + b.cmovimiento[i]) / (a.masa + b.masa);
            }
            double[] aceleracion = new double[a.aceleracion.Length];
            for (int i = 0; i < aceleracion.Length; i++)
            {
                //aceleracion[i] = ((a.masa * a.aceleracion[i]) + (b.masa * b.aceleracion[i])) / (a.masa + b.masa);
                aceleracion[i] = 0;
            }
            Particula res = new Particula(a.masa + b.masa, a.carga + b.carga, p, velocidad, aceleracion, a.dev);

            res.nombre  = a.nombre + " + " + b.nombre;
            p           = null;
            velocidad   = null;
            aceleracion = null;
            return(res);
        }
Example #2
0
        private static double DistanciaCartesiana(Particula p1, Particula p2)
        {
            double aux = 0;

            for (int i = 0; i < p1.posicion.Length; i++)
            {
                aux += Math.Pow(p1.posicion[i] - p2.posicion[i], 2);
            }
            aux = Math.Sqrt(aux);
            return(aux);
        }
Example #3
0
 public static double[] Magnetica(Particula p, double[] campo)
 {
     double[] v = new double[3] {
         p.velocidad[0], p.velocidad[1], (p.velocidad.Length < 3?0:p.velocidad[2])
     };
     double[] f = new double[3] {
         p.carga *(v[1] * campo[2] - v[2] * campo[1]), p.carga *(v[2] * campo[0] - v[0] * campo[2]), p.carga *(v[0] * campo[1] - v[1] * campo[0])
     };
     v = null;
     return(f);
 }
Example #4
0
        private static double[] VectorUnitario(Particula p1, Particula p2)
        {
            double[] aux = new double[p1.posicion.Length];
            double   d   = Interaccion.DistanciaCartesiana(p1, p2);

            for (int i = 0; i < aux.Length; i++)
            {
                aux[i] = (p1.posicion[i] - p2.posicion[i]) / d;
            }
            return(aux);
        }
Example #5
0
        public double[] VUnitario(Particula p)
        {
            double dist = this.distancia(p);

            double[] u = new double[this.posicion.Length];
            for (int i = 0; i < u.Length; i++)
            {
                u[i] = (this.posicion[i] - p.posicion[i]) / dist;
            }
            return(u);
        }
Example #6
0
        public double distancia(Particula p)
        {
            double dist = 0;

            for (int i = 0; i < this.posicion.Length; i++)
            {
                dist += Math.Pow(this.posicion[i] - p.posicion[i], 2);
            }
            dist = Math.Sqrt(dist);
            return(dist);
        }
Example #7
0
        public static double[] Electroestatica(Particula p1, Particula p2)
        {
            double[] f    = new double[p1.aceleracion.Length];
            double   dist = Interaccion.DistanciaCartesiana(p1, p2);

            double[] u = Interaccion.VectorUnitario(p1, p2);
            for (int i = 0; i < f.Length; i++)
            {
                f[i] = (Particula.K * (p1.carga * p2.carga) / (dist * dist)) * u[i];
            }
            return(f);
        }
Example #8
0
        public static double[] Gravitatoria(Particula p1, Particula p2)
        {
            double[] f    = new double[p1.aceleracion.Length];
            double   dist = Interaccion.DistanciaCartesiana(p1, p2);

            double[] u = Interaccion.VectorUnitario(p1, p2);
            for (int i = 0; i < f.Length; i++)
            {
                f[i] = -1 * (Particula.G * (p1.masa * p2.masa) / (dist * dist)) * u[i];
            }
            return(f);
        }
Example #9
0
        public double[] IntElectronica(Particula p)
        {
            double[] f    = new double[this.aceleracion.Length];
            double   dist = this.distancia(p);

            double[] u = this.VUnitario(p);
            for (int i = 0; i < f.Length; i++)
            {
                f[i] = (K * (this.carga * p.carga) / (dist * dist)) * u[i];
            }
            u = null;
            return(f);
        }
Example #10
0
        public double[] IntGravitacion(Particula p)
        {
            double[] f    = new double[this.aceleracion.Length];
            double   dist = this.distancia(p);

            double[] u = this.VUnitario(p);
            for (int i = 0; i < f.Length; i++)
            {
                f[i] = -1 * (G * (this.masa * p.masa) / (dist * dist)) * u[i];
            }
            u = null;
            return(f);
        }
Example #11
0
        public Particula Interactuar(Particula p, double delta)
        {
            Particula resultante = null;

            if (p != null)
            {
                if (this.distancia(p) < 10)
                {
                    resultante = this + p;
                }
                else
                {
                    double[] ftot = new double[p.aceleracion.Length];
                    double[] fg   = this.IntGravitacion(p);
                    double[] fe   = this.IntElectronica(p);
                    for (int i = 0; i < ftot.Length; i++)
                    {
                        ftot[i]             = fg[i] + fe[i];
                        this.aceleracion[i] = ftot[i] / this.masa;
                    }
                    ftot = null;
                    fg   = null;
                    fe   = null;
                    //Velocidad
                    for (int i = 0; i < this.aceleracion.Length; i++)
                    {
                        this.velocidad[i] = this.velocidad[i] + this.aceleracion[i] * delta;
                    }
                    //Posicion
                    for (int i = 0; i < this.velocidad.Length; i++)
                    {
                        this.posicion[i] = this.posicion[i] + this.velocidad[i] * delta;
                    }
                }
            }
            else
            {
                for (int i = 0; i < this.aceleracion.Length; i++)
                {
                    this.velocidad[i] = this.velocidad[i] + this.aceleracion[i] * delta;
                }
                //Posicion
                for (int i = 0; i < this.velocidad.Length; i++)
                {
                    this.posicion[i] = this.posicion[i] + this.velocidad[i] * delta;
                }
            }
            return(resultante);
        }
Example #12
0
        public static Particula Interacturar(Particula p1, Particula p2, double[] campo, double delta)
        {
            Particula p = null;

            if (p2 != null && p1.distancia(p2) < 10)
            {
                p  = p1 + p2;
                p1 = null;
                p2 = null;
                Interaccion.Int(ref p, null, campo, delta);
            }
            else
            {
                Interaccion.Int(ref p1, p2, campo, delta);
                if (p2 != null)
                {
                    Interaccion.Int(ref p2, p1, campo, delta);
                }
            }
            return(p);
        }
Example #13
0
 private static void Int(ref Particula p1, Particula p2, double[] campo, double delta)
 {
     double[] g = (p2 != null?Interaccion.Gravitatoria(p1, p2):null);
     double[] e = (p2 != null ? Interaccion.Electroestatica(p1, p2) :null);
     double[] m = Interaccion.Magnetica(p1, campo);
     for (int i = 0; i < p1.aceleracion.Length; i++)
     {
         if (p2 != null)
         {
             p1.aceleracion[i] = (g[i] + e[i] + m[i]) / p1.masa;
         }
         else
         {
             p1.aceleracion[i] = m[i] / p1.masa;
         }
         p1.velocidad[i] = p1.velocidad[i] + p1.aceleracion[i] * delta;
         p1.posicion[i]  = p1.posicion[i] + p1.velocidad[i] * delta;
     }
     g = null;
     e = null;
     m = null;
     GC.Collect();
 }
Example #14
0
        private void InicializaBucle(string RutaPart)
        {
            List <Particula> particulas = new List <Particula>();

            foreach (string f in System.IO.Directory.GetFiles(RutaPart, "*.xml"))
            {
                Particula aux = new Particula(f, new double[] { this.Width / 2, this.Height / 2 }, this._pantalla);
                particulas.Add(aux);
            }
            while (!this._salirBucle)
            {
                this._pantalla.BeginScene();
                this._pantalla.Clear(ClearFlags.Target, Color.Black, 0, 0);
                //hago la interacion entre particulas
                for (int i = 0; i < particulas.Count; i++)
                {
                    for (int j = 0; j < particulas.Count; j++)
                    {
                        if (particulas[i] != null)
                        {
                            if (i != j)
                            {
                                //Particula aux = particulas[i].Interactuar(particulas[j], this._delta);
                                Particula aux = Interaccion.Interacturar(particulas[i], particulas[j], this._campmag, this._delta);
                                if (aux != null)
                                {
                                    particulas[i].Dispose();
                                    particulas[i] = null;
                                    particulas[j].Dispose();
                                    particulas[j] = null;
                                    particulas.Add(aux);
                                }
                            }
                        }
                    }
                }
                GC.Collect();
                for (int i = 0; i < particulas.Count; i++)
                {
                    if (particulas[i] != null)
                    {
                        particulas[i].Dibuja();
                    }
                }
                this._pantalla.EndScene();
                this._pantalla.Present();
                Application.DoEvents();
            }
            for (int i = 0; i < particulas.Count; i++)
            {
                if (particulas[i] != null)
                {
                    particulas[i].Dispose();
                    particulas[i] = null;
                }
            }
            if (this._pantalla != null)
            {
                this._pantalla.Dispose();
                this._pantalla = null;
                GC.Collect();
            }
        }