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