Пример #1
0
        public static void BuildCircle(int x, int y, int r, int R)
        {
            Particle mid = new Particle();

            mid.Position = new Vector(x, y);
            mid.Radius   = R;
            World.AddParticle(mid);

            Particle prev  = null;
            Particle first = null;
            Vector   rv    = new Vector(r, 0);

            int k = (int)((2 * 3.14 * r) / (mid.Radius * 3));

            k += 1;
            for (int i = 0; i < k; i++)
            {
                Particle p = new Particle();
                p.Radius = R;
                p.Mass   = 1;
                if (first == null)
                {
                    first = p;
                }
                p.Position = new Vector(x + rv.X, y + rv.Y);
                Vector n = rv.Orthogonal();
                n.Normalize();
                n  *= (p.Radius * 3);
                rv += n;
                rv.Normalize();
                rv *= r;
                World.AddParticle(p);
                ParticleConnection cm = new ParticleConnection(mid, p);
                //cm.RestLength = r - r / 8;
                cm.SpringConstant = 200;
                //cm.DampingConstant = 100;
                World.Connections.Add(cm);

                if (prev != null)
                {
                    ParticleConnection c = new ParticleConnection(prev, p);
                    c.RestLength     /= 1.1;
                    c.SpringConstant  = 300;
                    c.DampingConstant = 40;
                    World.Connections.Add(c);
                }
                prev = p;
            }
            ParticleConnection cc = new ParticleConnection(prev, first);

            cc.SpringConstant  = 300;
            cc.DampingConstant = 40;
            cc.RestLength     /= 1.1;
            //cc.RestLength = (prev.Position - first.Position).Length;
            World.Connections.Add(cc);
        }
Пример #2
0
        public static bool TryCollision(Particle p, Line line)
        {
            Vector L = p.Position - line.Point1;
            Vector u = line.Point2 - line.Point1; u.Normalize();

            double d = Math.Abs(L.OrthogonalDistance(u));

            if (d > p.Radius)
            {
                return(false);
            }

            Vector v = p.Velocity;
            Vector x = (v * u) * u;

            Vector n = u.Orthogonal(); n.Normalize();

            if (Vector.Direction(line.Point1, line.Point2, p.Position) < 0)
            {
                n = -n;
            }

            Vector y = (v * n) * n;

            double e = Math.Min(p.Restitution, line.Restitution);

            p.Velocity -= (2 * y) * e;

            Vector G = p.Mass * new Vector(0, -World.Gravity);
            //p.Force += G;

            //Vector F = (G * u) * u;
            Vector N = (G * n) * n;

            //p.Force += N;

            //? czy jest ok ?
            if ((n ^ p.Velocity) > 0)
            {
                u = -u;
            }

            Vector T = 10000.9 * (N * u) * u;

            //p.Force += T;

            p.Position += (p.Radius - d) * -n;

            return(true);
        }
Пример #3
0
        public static bool TryCollision(Particle p, Segment s)
        {
            Vector L = p.Position - s.Point1;
            Vector u = s.Point2 - s.Point1; u.Normalize();

            double d = Math.Abs(L.OrthogonalDistance(u));

            if (d > p.Radius)
            {
                return(false);
            }

            Vector v = p.Velocity;
            Vector x = (v * u) * u;

            Vector n = u.Orthogonal(); n.Normalize();

            if (Vector.Direction(s.Point1, s.Point2, p.Position) < 0)
            {
                n = -n;
            }

            Vector s1 = s.Point1 + n;
            Vector s2 = s.Point2 + n;
            Vector p1 = p.Position - s.Point1;
            Vector p2 = p.Position - s.Point2;

            Vector mid = s.Middle();

            if ((mid - p.Position).Length > s.Length / 2)  //nie ma zderzenia z odcinkiem
            {
                return(false);
            }

            //if ((s.Point1 - p.Position).Length > p.Radius && (s.Point2 - p.Position).Length > p.Radius)
            //  return false;

            Vector y = (v * n) * n;

            double e = Math.Min(p.Restitution, s.Restitution);

            p.Velocity -= (2 * y) * e;

            Vector G = p.Mass * new Vector(0, -World.Gravity);
            //p.Force += G;

            //Vector F = (G * u) * u;
            Vector N = (G * n) * n;

            //p.Force += N;

            if ((n ^ p.Velocity) > 0)
            {
                u = -u;
            }

            Vector T = 10000.9 * (N * u) * u;

            //p.Force += T;

            p.Position += (p.Radius - d) * -n;

            return(true);
        }