private void CalcHitVelocity(PhysicsCircle circle1, PhysicsCircle circle2) { double distance = circle1.CenterPoint.GetDistance(circle2.CenterPoint); // mormal double nx = (circle2.CenterPoint.X - circle1.CenterPoint.X) / distance; double ny = (circle2.CenterPoint.Y - circle1.CenterPoint.Y) / distance; // tangent double tx = -ny; double ty = nx; //dot product tangent double dpTan1 = circle1.Velocity.X * tx + circle1.Velocity.y * ty; double dpTan2 = circle2.Velocity.X * tx + circle2.Velocity.y * ty; dpTan1 *= 1.3; dpTan2 *= 1.3; circle1.Velocity.X = tx * dpTan1; circle1.Velocity.y = ty * dpTan1; circle2.Velocity.X = tx * dpTan2; circle2.Velocity.y = tx * dpTan2; }
public static bool pointInCircle(Vector2 point, PhysicsCircle circle) { var dx = point.X - circle.origin.X; var dy = point.Y - circle.origin.Y; return(((dx * dx) + (dy * dy)) <= (circle.radius * circle.radius)); }
public static bool CirclevsCircleOptimized(PhysicsCircle a, PhysicsCircle b) { float r = a.Radius + b.Radius; float X = (a.Origin.X + b.Origin.X); float Y = (a.Origin.Y + b.Origin.Y); r *= r; return(r < ((X * X) + (Y * Y))); }
public Projectile(Game1 game, Vector2 origin, int size, int initialVelocity, double initialAngle, Texture2D texture) { active = true; circle = new PhysicsCircle(origin, size / 2); this.texture = texture; var radians = initialAngle * (Math.PI / 180.0); xVelocity = (float)(initialVelocity * Math.Cos(radians)); yVelocity = (float)(initialVelocity * Math.Sin(radians)); this.game = game; game.particleEngine.rocketSystem.Emitter.Add(circle.origin); }
public static Vector2 pointOnCircle(Vector2 point, PhysicsCircle circle) { var dx = point.X - circle.origin.X; var dy = point.Y - circle.origin.Y; var d = Math.Sqrt((dx * dx) + (dy * dy)); if (d <= circle.radius) { return(point); } return(new Vector2(((float)(dx / d * circle.radius) + circle.origin.X), ((float)(dy / d * circle.radius) + circle.origin.Y))); }
public void CircleCollision(PhysicsCircle circle1, PhysicsCircle circle2) { //todo: implement entitiyCollision double xDistance = circle1.CenterPoint.X - circle2.CenterPoint.X; double yDistance = circle1.CenterPoint.Y - circle2.CenterPoint.Y; double radiusSum = circle1.Radius + circle2.Radius; if (xDistance * xDistance + yDistance * yDistance <= radiusSum * radiusSum) { FixOverlap(circle1, circle2); CalcHitVelocity(circle1, circle2); } }
private void FixOverlap(PhysicsCircle circle1, PhysicsCircle circle2) { double xDistance = circle1.CenterPoint.X - circle2.CenterPoint.X; double yDistance = circle1.CenterPoint.Y - circle2.CenterPoint.Y; double cDistance = Math.Sqrt(xDistance * xDistance + yDistance * yDistance); double Overlap = 0.5f * (cDistance - circle1.Radius - circle2.Radius); //fix pos of first circle double newX = circle1.CenterPoint.X - Overlap * (circle1.CenterPoint.X - circle2.CenterPoint.X) / cDistance; double newY = circle1.CenterPoint.Y - Overlap * (circle1.CenterPoint.Y - circle2.CenterPoint.Y) / cDistance; circle1.SetCenterPoint(newX, newY); //fix pos of second circle newX = circle2.CenterPoint.X + Overlap * (circle1.CenterPoint.X - circle2.CenterPoint.X) / cDistance; newY = circle2.CenterPoint.Y + Overlap * (circle1.CenterPoint.Y - circle2.CenterPoint.Y) / cDistance; circle2.SetCenterPoint(newX, newY); }
public static bool Collides(PhysicsCircle circle1, PhysicsCircle circle2) { return(Within.pointInCircle(circle1.origin, new PhysicsCircle(circle2.origin, circle1.radius + circle2.radius))); }
public static bool Collides(PhysicsCircle circle, PhysicsRectangle rect) { var point = Nearest.pointOnRectangle(circle.origin, rect); return(Within.pointInCircle(point, circle)); }
public static bool IsColliding(PhysicsCircle circle1, PhysicsCircle circle2) { return(Within.pointInCircle(circle1.Origin, new PhysicsCircle(circle2.Origin, circle1.Radius + circle2.Radius))); }