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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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(); }
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(); } }