package net.sf.openrocket.rocketcomponent;
import net.sf.openrocket.preset.ComponentPreset;
/**
* Class to represent a body object. The object can be described as a function of
* the cylindrical coordinates x and angle theta as r = f(x,theta). The component
* need not be symmetrical in any way (e.g. square tube, slanted cone etc).
*
* It defines the methods getRadius(x,theta) and getInnerRadius(x,theta), as well
* as get/setLength().
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public abstract class BodyComponent extends ExternalComponent {
/**
* Default constructor. Sets the relative position to POSITION_RELATIVE_AFTER,
* i.e. body components come after one another.
*/
public BodyComponent() {
super(RocketComponent.Position.AFTER);
}
/**
* Get the outer radius of the component at cylindrical coordinate (x,theta).
*
* Note that the return value may be negative for a slanted object.
*
* @param x Distance in x direction
* @param theta Angle about the x-axis
* @return Distance to the outer edge of the object
*/
public abstract double getRadius(double x, double theta);
/**
* Get the inner radius of the component at cylindrical coordinate (x,theta).
*
* Note that the return value may be negative for a slanted object.
*
* @param x Distance in x direction
* @param theta Angle about the x-axis
* @return Distance to the inner edge of the object
*/
public abstract double getInnerRadius(double x, double theta);
@Override
protected void loadFromPreset(ComponentPreset preset) {
super.loadFromPreset(preset);
}
/**
* Sets the length of the body component.
* <p>
* Note: This should be overridden by the subcomponents which need to call
* clearPreset(). (BodyTube allows changing length without resetting the preset.)
*/
public void setLength(double length) {
if (this.length == length)
return;
this.length = Math.max(length, 0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
}
@Override
public boolean allowsChildren() {
return true;
}
}