1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
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())) {
            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. 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 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. :)
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Gravity with Java
  1. Java Resources (Replies: 4)

  2. [Java] PNGException (Replies: 2)

  3. JAVA GridLayout (Replies: 1)

  4. Java interpreter (Replies: 8)

  5. Java Cylinders (Replies: 2)

Loading...