[refactor] BodyTube now implements the BoxBounded interface

This commit is contained in:
Daniel_M_Williams 2020-06-20 15:29:45 -04:00
parent 7b81f763c7
commit 22160dbe5d
2 changed files with 15 additions and 56 deletions

View File

@ -10,6 +10,7 @@ import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.motor.MotorConfigurationSet;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BoundingBox;
import net.sf.openrocket.util.BugException;
import net.sf.openrocket.util.Coordinate;
import net.sf.openrocket.util.MathUtil;
@ -21,7 +22,7 @@ import net.sf.openrocket.util.MathUtil;
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial {
public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMount, Coaxial {
private static final Translator trans = Application.getTranslator();
private double outerRadius = 0;
@ -296,52 +297,19 @@ public class BodyTube extends SymmetricComponent implements MotorMount, Coaxial
private static double getFilledVolume(double r, double l) {
return Math.PI * r * r * l;
}
/**
* Adds bounding coordinates to the given set. The body tube will fit within the
* convex hull of the points.
*
* Currently the points are simply a rectangular box around the body tube.
*/
@Override
public Collection<Coordinate> getComponentBounds() {
Collection<Coordinate> bounds = new ArrayList<Coordinate>(8);
double x_min_shape = 0;
double x_max_shape = this.length;
double r_max_shape = getOuterRadius();
Coordinate[] locs = this.getLocations();
// not strictly accurate, but this should provide an acceptable estimate for total vehicle size
double x_min_inst = Double.MAX_VALUE;
double x_max_inst = Double.MIN_VALUE;
double r_max_inst = 0.0;
// refactor: get component inherent bounds
for (Coordinate cur : locs) {
double x_cur = cur.x;
double r_cur = MathUtil.hypot(cur.y, cur.z);
if (x_min_inst > x_cur) {
x_min_inst = x_cur;
}
if (x_max_inst < x_cur) {
x_max_inst = x_cur;
}
if (r_cur > r_max_inst) {
r_max_inst = r_cur;
}
}
// combine the position bounds with the inherent shape bounds
double x_min = x_min_shape + x_min_inst;
double x_max = x_max_shape + x_max_inst;
double r_max = r_max_shape + r_max_inst;
addBoundingBox(bounds, x_min, x_max, r_max);
return bounds;
public BoundingBox getInstanceBoundingBox(){
BoundingBox instanceBounds = new BoundingBox();
instanceBounds.update(new Coordinate(this.getLength(), 0,0));
final double r = getOuterRadius();
instanceBounds.update(new Coordinate(0,r,r));
instanceBounds.update(new Coordinate(0,-r,-r));
return instanceBounds;
}
/**
* Check whether the given type can be added to this component. BodyTubes allow any
* InternalComponents or ExternalComponents, excluding BodyComponents, to be added.

View File

@ -581,17 +581,8 @@ public class FlightConfiguration implements FlightConfigurableParameter<FlightCo
}
componentBounds = instanceBounds.transform(context.transform);
}
}else if (component instanceof BodyTube) {
// Legacy Case #1:
// These components do not need the transform performed in
// order to provide the proper coordinates for length calculation.
// The transformation will cause the values to be calculated
// incorrectly. This should be fixed in the appropriate places
// not handled as one-offs in here.
componentBounds.update(component.getComponentBounds());
} else {
// Legacy Case #2:
// These components do not implement
// Legacy Case: These components do not implement the BoxBounded Interface.
Collection<Coordinate> instanceCoordinates = component.getComponentBounds();
for (InstanceContext context : contexts) {
/*