我正在编写一个java太阳系类型模拟器,我的物理学出了点问题,我无法弄清楚原因。我确定它在某处是一个简单的单线错误。发生了什么,一个身体会移动,看起来它会开始绕另一个身体运行,然后身体将无缘无故地飞向太空。这是GitHub上的项目:https://github.com/Ronin11/FunWithGit/tree/dev
这是物理学:
import java.util.ArrayList;
public class physics {
private final static double G = 6.6738489E-11; //Newton's "Big" G
private final static double Multiplier = 10E9; //Gravity Equation Multiplier
private static double calculateGravity(Body m1, Body m2, boolean returnX){
/***** Newton's universal law of gravitation with
the distance formula substituted for r^2 ****/
double force = ((G*m1.getMass()*m2.getMass())/
(StrictMath.pow((m2.getposx()-m1.getposx()),2)
+ StrictMath.pow((m2.getposy() - m1.getposy()), 2)));
//System.out.println(force);
double angle = StrictMath.atan((m2.getposy()-m1.getposy())/(m2.getposx()-m1.getposx()));
//System.out.println(angle*180);
if(returnX)
force = force * StrictMath.cos(angle);
else
force = force * StrictMath.sin(angle);
return force;
}
private static double calculateAcceleration(double Force, Body m){
/** Force = Mass * Acceleration **/
double Acc = Force/m.getMass();
return Acc;
}
/** Change the velocity with the force calculations**/
private static void velChanges(Body b,ArrayList <Body> system){
double xAccel = 0;
double yAccel = 0;
for (Body body: system){
if(b != body){
xAccel += calculateAcceleration(calculateGravity(b,body,true),b);
yAccel += calculateAcceleration(calculateGravity(b,body,false),b);
}
}
xAccel = Multiplier * xAccel; // Static Multipliers to
yAccel = Multiplier * yAccel; // make things play nicer
b.setvelx(b.getvelx()+xAccel);
b.setvely(b.getvely()+yAccel);
}
/** Change the position to the new position **/
private static void posChanges(Body b){
b.setposx(b.getposx()+b.getvelx());
b.setposy(b.getposy()+b.getvely());
}
/** Nice little method for GUI.java to call **/
public static void calculateChanges(ArrayList <Body> system){
for (Body b: system) {
velChanges(b,system);
posChanges(b);
}
}
}
这是Body类:
import java.awt.Color;
/**
*
* @author Ronin
*
* The body class is a simple object used in the Gravity program.
* All bodies will have the six variables associated with them to
* run the simulation. Eventually the color variable will be
* determined by the density of the body.
*
*/
public class Body {
public Body(){
mass = 100;
size = 1;
velX = 0;
velY = 0;
posX = 0;
posY = 0;
color = Color.white;
}
public Body(int mass, int size, Color color, double velX, double velY, double posX, double posY){
this.mass = mass;
this.size = size;
this.color = color;
this.velX = velX;
this.velY = velY;
this.posX = posX;
this.posY = posY;
}
//Getters
public int getMass(){return mass;}
public int getSize(){return size;}
public double getvelx(){return velX;}
public double getvely(){return velY;}
public double getposx(){return posX+velX;}
public double getposy(){return posY+velY;}
public Color getColor(){return color;}
//Setters
public void setMass(int m){mass = m;}
public void setSize(int s){size = s;}
public void setvelx(double v){velX = v;}
public void setvely(double v){velY = v;}
public void setposx(double p){posX = p;}
public void setposy(double p){posY = p;}
public void setColor(Color c){color = c;}
//Member Variables
private Color color;
private int mass;
private int size;
private double velX;
private double velY;
private double posX;
private double posY;
}
谢谢!