Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Gravity with Java

  1. Dec 17, 2008 #1
    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())) {
        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));
        } else { // gravity acts on both, pulling them toward each other
            double resultantGravAngle = (gravityAngle/2),
                   resultantGravDistance = (gravityDistance /2);
            gravityCache.add(new Vector2D(resultantGravAngle, resultantGravDistance));
            planet.getGravityCache().add(new Vector2D(resultantGravAngle, resultantGravDistance));
    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. jcsd
  3. Dec 17, 2008 #2
    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.
  4. Dec 17, 2008 #3
    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;
  5. Dec 17, 2008 #4
    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.
  6. Dec 18, 2008 #5
    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