package net.sf.openrocket.simulation;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.Quaternion;
public final class AccelerationData {
private Coordinate linearAccelerationRC;
private Coordinate rotationalAccelerationRC;
private Coordinate linearAccelerationWC;
private Coordinate rotationalAccelerationWC;
// Rotates from rocket coordinates to world coordinates
private final Quaternion rotation;
public AccelerationData(Coordinate linearAccelerationRC, Coordinate rotationalAccelerationRC,
Coordinate linearAccelerationWC, Coordinate rotationalAccelerationWC,
Quaternion rotation) {
if ((linearAccelerationRC == null && linearAccelerationWC == null) ||
(rotationalAccelerationRC == null && rotationalAccelerationWC == null) ||
rotation == null) {
throw new IllegalArgumentException("Parameter is null: " +
" linearAccelerationRC=" + linearAccelerationRC +
" linearAccelerationWC=" + linearAccelerationWC +
" rotationalAccelerationRC=" + rotationalAccelerationRC +
" rotationalAccelerationWC=" + rotationalAccelerationWC +
" rotation=" + rotation);
}
this.linearAccelerationRC = linearAccelerationRC;
this.rotationalAccelerationRC = rotationalAccelerationRC;
this.linearAccelerationWC = linearAccelerationWC;
this.rotationalAccelerationWC = rotationalAccelerationWC;
this.rotation = rotation;
}
public Coordinate getLinearAccelerationRC() {
if (linearAccelerationRC == null) {
linearAccelerationRC = rotation.invRotate(linearAccelerationWC);
}
return linearAccelerationRC;
}
public Coordinate getRotationalAccelerationRC() {
if (rotationalAccelerationRC == null) {
rotationalAccelerationRC = rotation.invRotate(rotationalAccelerationWC);
}
return rotationalAccelerationRC;
}
public Coordinate getLinearAccelerationWC() {
if (linearAccelerationWC == null) {
linearAccelerationWC = rotation.rotate(linearAccelerationRC);
}
return linearAccelerationWC;
}
public Coordinate getRotationalAccelerationWC() {
if (rotationalAccelerationWC == null) {
rotationalAccelerationWC = rotation.rotate(rotationalAccelerationRC);
}
return rotationalAccelerationWC;
}
public Quaternion getRotation() {
return rotation;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof AccelerationData))
return false;
AccelerationData other = (AccelerationData) obj;
return (this.getLinearAccelerationRC().equals(other.getLinearAccelerationRC()) &&
this.getRotationalAccelerationRC().equals(other.getRotationalAccelerationRC()));
}
@Override
public int hashCode() {
return getLinearAccelerationRC().hashCode() ^ getRotationalAccelerationRC().hashCode();
}
}