/*public static Engine.Calc.Vector ExpressiveForce(this Engine.Effects.Particles.Attractor attractor, * Engine.Effects.Particles.ForceParticle p) * { * float G = 4f; * * Engine.Calc.Vector relDistance = attractor.Distance(p); * * float distance = relDistance.Norm; // Norm seems the magnitude in Processing * * float force = G / distance; * * force = Engine.Calc.Math.Sigmoid(force); * * relDistance.Normalize(); * Engine.Calc.Vector.Multiply(relDistance, force); * * return relDistance; * }*/ /// <summary> /// /// </summary> /// <param name="attractor"></param> /// <param name="p"></param> /// <param name="G">The "Gravitational constant" of the force (suggested value 1.3)</param> /// <param name="expansion">Allows the force to be stronger or weaker on longer distances while remaining weak at very short distances. /// suggested value 2.8</param> /// <param name="direction">the direction of the force. positive makes the force attraction, negative makes the force repulsion. suggested value 0.5 or -0.5</param> /// <returns></returns> public static Engine.Calc.Vector ModularForce(this Engine.Effects.Particles.Attractor attractor, Engine.Effects.Particles.ForceParticle p) { Engine.Calc.Vector relDistance = attractor.Distance(p); double distance = System.Math.Sqrt(relDistance.X * relDistance.X + relDistance.Y * relDistance.Y); double force = (attractor.Intensity * attractor.Force * distance) - 10d / System.Math.Pow(attractor.Expression, -1 * (distance / attractor.Force)); relDistance.Normalize(); relDistance *= force; return(relDistance); }
public void VelocityFriction(double a, double b, double c) { // The force of pressure affects velocity for (int iterate = 0; iterate < 1; iterate++) { // NOTE: We include the border cells in global friction for (int x = 0; x < t_width; x++) { for (int y = 0; y < t_height; y++) { int cell = CellOffset(x, y, t_width); Engine.Calc.Vector v = new Engine.Calc.Vector(mp_xv0[cell], mp_yv0[cell]); double len2 = v.MagnitudeSquared(); double len = System.Math.Sqrt(len2); if (len < 0.0f) { len = -len; } len -= m_dt * (a * len2 + b * len + c); if (len < 0.0d) { len = 0.0d; } if (len < 0.0f) { len = 0.0f; } v.Normalize(); v.SetMagnitude(len); mp_xv0[cell] = v.X; mp_yv0[cell] = v.Y; } } } }
private int Threaded_GetParticles(int start, int end, Threading.ParamList paramlist) { Engine.Effects.Code.Particles.AutonomousParticle[] particles = (Engine.Effects.Code.Particles.AutonomousParticle[])paramlist.Get("particles").Value; for (int x = start; x < end; x++) { for (int y = 0; y < t_cells.GetLength(1); y++) { int offset = Engine.Surface.Ops.GetGridOffset(x, y, t_cells.GetLength(0), t_cells.GetLength(1)); particles[offset] = new Effects.Code.Particles.AutonomousParticle(new Engine.Calc.Vector((x * t_gridCellWidth) + (t_gridCellWidth / 2), (y * t_gridCellHeight) + (t_gridCellHeight / 2))); Engine.Calc.Vector vel = t_cells[x, y].Pressure; vel.Normalize(); vel.SetMagnitude(2); particles[offset].Velocity = vel; //t_cells[x, y].CalculateAveragePressure(t_flowField, x * t_gridCellWidth, y * t_gridCellHeight); } } return(0); }