示例#1
0
        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;
        }
示例#2
0
        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));
        }
示例#3
0
        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)));
        }
示例#4
0
        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);
        }
示例#5
0
        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)));
        }
示例#6
0
        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);
            }
        }
示例#7
0
        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);
        }
示例#8
0
 public static bool Collides(PhysicsCircle circle1, PhysicsCircle circle2)
 {
     return(Within.pointInCircle(circle1.origin, new PhysicsCircle(circle2.origin, circle1.radius + circle2.radius)));
 }
示例#9
0
        public static bool Collides(PhysicsCircle circle, PhysicsRectangle rect)
        {
            var point = Nearest.pointOnRectangle(circle.origin, rect);

            return(Within.pointInCircle(point, circle));
        }
示例#10
0
 public static bool IsColliding(PhysicsCircle circle1, PhysicsCircle circle2)
 {
     return(Within.pointInCircle(circle1.Origin, new PhysicsCircle(circle2.Origin, circle1.Radius + circle2.Radius)));
 }