1 package JSci.physics; 2 3 import JSci.maths.NumericalConstants; 4 5 10 public class RigidBody3D extends ClassicalParticle3D { 11 14 protected double angMass; 15 18 protected double angx, angy, angz; 19 22 protected double angxVel, angyVel, angzVel; 23 26 public RigidBody3D() {} 27 30 public void setMomentOfInertia(double MoI) { 31 angMass = MoI; 32 } 33 36 public double getMomentOfInertia() { 37 return angMass; 38 } 39 45 public void setAngles(double angleX, double angleY, double angleZ) { 46 angx = angleX; 47 angy = angleY; 48 angz = angleZ; 49 } 50 54 public double getXAngle() { 55 return angx; 56 } 57 61 public double getYAngle() { 62 return angy; 63 } 64 68 public double getZAngle() { 69 return angz; 70 } 71 public void setAngularVelocity(double angleXVel, double angleYVel, double angleZVel) { 72 angxVel = angleXVel; 73 angyVel = angleYVel; 74 angzVel = angleZVel; 75 } 76 public double getXAngularVelocity() { 77 return angxVel; 78 } 79 public double getYAngularVelocity() { 80 return angyVel; 81 } 82 public double getZAngularVelocity() { 83 return angzVel; 84 } 85 public void setAngularMomentum(double angleXMom, double angleYMom, double angleZMom) { 86 angxVel = angleXMom/angMass; 87 angyVel = angleYMom/angMass; 88 angzVel = angleZMom/angMass; 89 } 90 public double getXAngularMomentum() { 91 return angMass*angxVel; 92 } 93 public double getYAngularMomentum() { 94 return angMass*angyVel; 95 } 96 public double getZAngularMomentum() { 97 return angMass*angzVel; 98 } 99 102 public double energy() { 103 return (mass*(vx*vx+vy*vy+vz*vz)+angMass*(angxVel*angxVel+angyVel*angyVel+angzVel*angzVel))/2.0; 104 } 105 110 public ClassicalParticle3D move(double dt) { 111 return rotate(dt).translate(dt); 112 } 113 118 public RigidBody3D rotate(double dt) { 119 angx += angxVel*dt; 120 if(angx > NumericalConstants.TWO_PI) 121 angx -= NumericalConstants.TWO_PI; 122 else if(angx < 0.0) 123 angx += NumericalConstants.TWO_PI; 124 angy += angyVel*dt; 125 if(angy > NumericalConstants.TWO_PI) 126 angy -= NumericalConstants.TWO_PI; 127 else if(angy < 0.0) 128 angy += NumericalConstants.TWO_PI; 129 angz += angzVel*dt; 130 if(angz > NumericalConstants.TWO_PI) 131 angz -= NumericalConstants.TWO_PI; 132 else if(angz < 0.0) 133 angz += NumericalConstants.TWO_PI; 134 return this; 135 } 136 143 public RigidBody3D angularAccelerate(double ax, double ay, double az, double dt) { 144 angxVel += ax*dt; 145 angyVel += ay*dt; 146 angzVel += az*dt; 147 return this; 148 } 149 156 public RigidBody3D applyTorque(double tx, double ty, double tz, double dt) { 157 return angularAccelerate(tx/angMass, ty/angMass, tz/angMass, dt); 158 } 159 168 public RigidBody3D applyForce(double fx, double fy, double fz, double x, double y, double z, double dt) { 169 applyTorque(y*fz-z*fy, z*fx-x*fz, x*fy-y*fx, dt); final double k=(x*fx+y*fy+z*fz)/(x*x+y*y+z*z); applyForce(k*x, k*y, k*z, dt); 172 return this; 173 } 174 } 175 176 | Popular Tags |