Beispiel #1
0
        /*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);
        }
Beispiel #2
0
        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;
                    }
                }
            }
        }
Beispiel #3
0
        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);
        }