# Gravity with Java

1. Dec 17, 2008

### Echilon

I'm pulling my hair out with this problem. I have two bodies and I'm trying to calculate gravity between them. This is for a game, and there are actually three bodies currently, each frame, I check the distance each one moves due to gravity and store it in a cache (to simulate gravity acting on all objects simultaneously), then apply each vector to the body. This is the code I have:
Code (Text):
public void calculateGravity(GravitationalBody planet) {
if(isFixed || gravityIndex.contains(planet.hashCode()) || planet.getGravityIndex().contains(this.hashCode())) {
return;
}
double radiusGravity = this.getCenter().distance(planet.getCenter());
double force = (Constants.G * this.mass * planet.mass)/(radiusGravity*radiusGravity); // F=GMm/r^2
double frameRateMs = (Constants.FrameRate/1000.0);
double gravityAngle = Math.atan2(Math.max(location.y,planet.location.y) - Math.min(location.y,planet.location.y),
Math.max(location.x,planet.location.x) - Math.min(location.x,planet.location.x)) + (Math.PI/2);
double gravityDistance = ((force*frameRateMs)/this.mass)*Constants.SpriteGravityMultiplier;
if(gravityAngle < 0){ // keep angle positive
gravityAngle += MaxAngle;
}
//        System.out.println("--"+name+"<->"+planet.getName()+"-"+gravityDistance+"px @ "+Math.round(gravityAngle)+"rad");
if(planet.IsFixed()) { // gravity acts only on this body, pulling it towards the planet
gravityCache.add(new Vector2D(gravityAngle, gravityDistance));
gravityIndex.add(planet.hashCode());
} else { // gravity acts on both, pulling them toward each other
double resultantGravAngle = (gravityAngle/2),
resultantGravDistance = (gravityDistance /2);
gravityCache.add(new Vector2D(resultantGravAngle, resultantGravDistance));
gravityIndex.add(planet.hashCode());
planet.getGravityCache().add(new Vector2D(resultantGravAngle, resultantGravDistance));
planet.getGravityIndex().add(planet.hashCode());
}
}
Assuming Constants.Framerate = 30, Constants.G = 6.667, Constants.SpriteGravityMultiplier = 1e1

The angles are off though, and I'm convinced it has something to do with the coordinate system Java uses for drawing but I can't get it to work properly. Is there anything obvious I've been overlooking?

2. Dec 17, 2008

### Coin

1. What do you mean by "the angles are off"?
2. Why do you do this thing with subtracting the min from the max, when you calculate gravityAngle? Maybe I just don't understand but it seems like that ought to introduce error to which quadrant your angle winds up in.

3. Dec 17, 2008

### Echilon

Gravity doesn't behave in the way you'd expect, it causes things to move round in seemingly random directions which don't appear to follow a pattern.

The subtracting thing was my way of trying to keep the angle positive. Ie: between 0 and 2pi and avoiding -1pi or 7pi, but I've since found it's easier to just do:
Code (Text):

gravityAngle = gravityAngle % MaxAngle;

4. Dec 17, 2008

### mathmate

Could you describe what is "off". Upside down, or random, or a constant difference?

Java plots with the x-axis to the right, and y-axis towards the bottom.
You may need to reverse the y-axis if you want to plot it like on a cartesian plane.

5. Dec 18, 2008

### Echilon

They seem to be randomly offset, or at least I can't see a pattern. I've followed suggestions and made some changes to the gravity methods, which I've posted at http://pastebin.com/m5e53fe34 [Broken] for the syntax highlighting. Maybe if you watch what's happening it would become apparent, so I've uploaded the current game at http://mi6.nu/ml.zip. It's just an executable jar.

Thanks again for any insight. :)

Last edited by a moderator: May 3, 2017
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook