Update travis-ci config file run unittests. Add new unittest ConfigurationTest.java. Fix FinRenderer.java to not have non-ascii character in a comment.
This commit is contained in:
parent
bc282a0e6c
commit
448d2e606c
@ -1,4 +1,6 @@
|
|||||||
language: java
|
language: java
|
||||||
jdk:
|
jdk:
|
||||||
- oraclejdk7
|
- oraclejdk7
|
||||||
script: "ant -buildfile core/build.xml clean checkascii build jar"
|
script:
|
||||||
|
- "ant -buildfile core/build.xml clean checkascii build jar"
|
||||||
|
- "ant -buildfile core/build.xml unittest"
|
||||||
|
@ -262,7 +262,7 @@ public class FinRenderer {
|
|||||||
// Given the sequentially connected points (a,b), (c,d), and (e,f), this
|
// Given the sequentially connected points (a,b), (c,d), and (e,f), this
|
||||||
// function returns, in (C,D), a bevel-inset replacement for point (c,d).
|
// function returns, in (C,D), a bevel-inset replacement for point (c,d).
|
||||||
//
|
//
|
||||||
// Note: If vectors (a,b)->(c,d) and (c,d)->(e,f) are exactly 180° opposed,
|
// Note: If vectors (a,b)->(c,d) and (c,d)->(e,f) are exactly 180 degrees opposed,
|
||||||
// or if either segment is zero-length, this function will do
|
// or if either segment is zero-length, this function will do
|
||||||
// nothing; i.e. point (C,D) will not be set.
|
// nothing; i.e. point (C,D) will not be set.
|
||||||
private Coordinate insetCorner(
|
private Coordinate insetCorner(
|
||||||
|
@ -0,0 +1,537 @@
|
|||||||
|
package net.sf.openrocket.rocketcomponent;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.BitSet;
|
||||||
|
import java.util.EventObject;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import net.sf.openrocket.logging.LogHelper;
|
||||||
|
import net.sf.openrocket.rocketcomponent.RocketComponent.Position;
|
||||||
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import net.sf.openrocket.util.StateChangeListener;
|
||||||
|
import net.sf.openrocket.util.BaseTestCase.BaseTestCase;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ConfigurationTest extends BaseTestCase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test change events and modIDs
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testChangeEvent() {
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeEmptyRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
StateChangeListener listener1 = new StateChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void stateChanged(EventObject e) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
StateChangeListener listener2 = new StateChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void stateChanged(EventObject e) {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
config.addChangeListener(listener1);
|
||||||
|
config.addChangeListener(listener2);
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// ModID should not change if nothing changed
|
||||||
|
int origModID = config.getModID();
|
||||||
|
int noChangeModID = config.getModID();
|
||||||
|
assertTrue(origModID == noChangeModID);
|
||||||
|
|
||||||
|
|
||||||
|
// After a change event, modID should change
|
||||||
|
config.fireChangeEvent();
|
||||||
|
int changeModID = config.getModID();
|
||||||
|
assertTrue(origModID < changeModID);
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
config.removeChangeListener(listener1);
|
||||||
|
config.removeChangeListener(listener2);
|
||||||
|
config.release();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test configuration rocket component and motor iterators
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testConfigIterators() {
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeSingleStageTestRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// Test rocket component iterator
|
||||||
|
// TODO: validate iterator iterates correctly
|
||||||
|
for (Iterator<RocketComponent> i = config.iterator(); i.hasNext();) {
|
||||||
|
i.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rocket component iterator remove method is unsupported, should throw exception
|
||||||
|
try {
|
||||||
|
Iterator<RocketComponent> configIterator = config.iterator();
|
||||||
|
configIterator.remove();
|
||||||
|
} catch (UnsupportedOperationException e) {
|
||||||
|
assertTrue(e.getMessage().equals("remove unsupported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test motor iterator
|
||||||
|
/* TODO: no motors in model Iterator<MotorMount> motorIterator()
|
||||||
|
* TODO: validate iterator iterates correctly
|
||||||
|
for (Iterator<MotorMount> i = config.motorIterator(); i.hasNext();) {
|
||||||
|
i.next();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Motor iterator remove method is unsupported, should throw exception
|
||||||
|
try {
|
||||||
|
Iterator<MotorMount> motorIterator = config.motorIterator();
|
||||||
|
motorIterator.remove();
|
||||||
|
} catch (UnsupportedOperationException e) {
|
||||||
|
assertTrue(e.getMessage().equals("remove unsupported"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
config.release();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty rocket (no components) specific configuration tests
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testEmptyRocket() {
|
||||||
|
Rocket r1 = makeEmptyRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
Configuration configClone = config.clone(); // TODO validate clone worked
|
||||||
|
assertFalse(config.getRocket() == null);
|
||||||
|
assertFalse(config.hasMotors());
|
||||||
|
|
||||||
|
config.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test flight configuration ID methods
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testFlightConfigID() {
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeSingleStageTestRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// Test flight configuration ID setting
|
||||||
|
String origFlightConfigID = config.getFlightConfigurationID(); // save for later
|
||||||
|
String testFlightConfigID = origFlightConfigID + "_ConfigurationTest";
|
||||||
|
|
||||||
|
// if id is already set (ie, not null), setting to null should work
|
||||||
|
assertFalse(config.getFlightConfigurationID() == null);
|
||||||
|
config.setFlightConfigurationID(null);
|
||||||
|
assertTrue(config.getFlightConfigurationID() == null);
|
||||||
|
|
||||||
|
// now that id is set to null, setting to null should not set again (do for coverage)
|
||||||
|
config.setFlightConfigurationID(null);
|
||||||
|
assertTrue(config.getFlightConfigurationID() == null);
|
||||||
|
|
||||||
|
// reset the id from null to a test value
|
||||||
|
config.setFlightConfigurationID(testFlightConfigID);
|
||||||
|
assertTrue(config.getFlightConfigurationID().equals(testFlightConfigID));
|
||||||
|
|
||||||
|
// setting it to the same non-null value should just return (do for coverage)
|
||||||
|
config.setFlightConfigurationID(testFlightConfigID);
|
||||||
|
assertTrue(config.getFlightConfigurationID().equals(testFlightConfigID));
|
||||||
|
|
||||||
|
// set back to original value
|
||||||
|
config.setFlightConfigurationID(origFlightConfigID);
|
||||||
|
assertTrue(config.getFlightConfigurationID().equals(origFlightConfigID));
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
config.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test flight configuration ID methods
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testGeneralMethods() {
|
||||||
|
|
||||||
|
LogHelper log = Application.getLogger();
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeSingleStageTestRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// general method tests
|
||||||
|
Configuration configClone = config.clone(); // TODO validate clone worked
|
||||||
|
|
||||||
|
assertFalse(config.getRocket() == null);
|
||||||
|
|
||||||
|
// TODO rocket has no motors! assertTrue(config.hasMotors());
|
||||||
|
|
||||||
|
// rocket info tests
|
||||||
|
|
||||||
|
double length = config.getLength();
|
||||||
|
double refLength = config.getReferenceLength();
|
||||||
|
double refArea = config.getReferenceArea();
|
||||||
|
|
||||||
|
// TODO validate that the values are correct
|
||||||
|
log.debug("ConfigurationTest, length: " + String.valueOf(length));
|
||||||
|
log.debug("ConfigurationTest, refLength: " + String.valueOf(refLength));
|
||||||
|
log.debug("ConfigurationTest, refArea: " + String.valueOf(refArea));
|
||||||
|
|
||||||
|
/* Cleanup */
|
||||||
|
config.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Single stage rocket specific configuration tests
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testSingleStageRocket() {
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeSingleStageTestRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
BitSet activeStageFlags = new BitSet();
|
||||||
|
activeStageFlags.set(0, false); // first stage
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// test cloning of single stage rocket
|
||||||
|
Configuration configClone = config.clone(); // TODO validate clone worked
|
||||||
|
|
||||||
|
// test explicitly setting only first stage active
|
||||||
|
config.setOnlyStage(0);
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, true);
|
||||||
|
validateStages(config, 1, activeStageFlags);
|
||||||
|
|
||||||
|
// test explicitly setting all stages up to first stage active
|
||||||
|
config.setToStage(0);
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, true);
|
||||||
|
validateStages(config, 1, activeStageFlags);
|
||||||
|
|
||||||
|
// test explicitly setting all stages active
|
||||||
|
config.setAllStages();
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, true);
|
||||||
|
validateStages(config, 1, activeStageFlags);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
config.release();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Multi stage rocket specific configuration tests
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMultiStageRocket() {
|
||||||
|
|
||||||
|
/* Setup */
|
||||||
|
Rocket r1 = makeTwoStageTestRocket();
|
||||||
|
Configuration config = r1.getDefaultConfiguration();
|
||||||
|
|
||||||
|
BitSet activeStageFlags = new BitSet();
|
||||||
|
activeStageFlags.set(0, false); // booster (first) stage
|
||||||
|
activeStageFlags.set(1, false); // sustainer (second) stage
|
||||||
|
|
||||||
|
/* Test */
|
||||||
|
|
||||||
|
// test cloning of two stage rocket
|
||||||
|
Configuration configClone = config.clone(); // TODO validate clone worked
|
||||||
|
|
||||||
|
// test explicitly setting only first stage active
|
||||||
|
config.setOnlyStage(0);
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, true);
|
||||||
|
validateStages(config, 2, activeStageFlags);
|
||||||
|
|
||||||
|
// test explicitly setting all stages up to first stage active
|
||||||
|
config.setToStage(0);
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, true);
|
||||||
|
validateStages(config, 2, activeStageFlags);
|
||||||
|
|
||||||
|
// test explicitly setting all stages up to second stage active
|
||||||
|
config.setToStage(1);
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, 2, true);
|
||||||
|
validateStages(config, 2, activeStageFlags);
|
||||||
|
|
||||||
|
// test explicitly setting all two stages active
|
||||||
|
config.setAllStages();
|
||||||
|
activeStageFlags.clear();
|
||||||
|
activeStageFlags.set(0, 2, true);
|
||||||
|
validateStages(config, 2, activeStageFlags);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
config.release();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////// Helper Methods ////////////////////////////
|
||||||
|
|
||||||
|
public void validateStages(Configuration config, int expectedStageCount, BitSet activeStageFlags) {
|
||||||
|
|
||||||
|
// test that getStageCount() returns correct value
|
||||||
|
int stageCount = config.getStageCount();
|
||||||
|
assertTrue(stageCount == expectedStageCount);
|
||||||
|
|
||||||
|
// test that getActiveStageCount() and getActiveStages() returns correct values
|
||||||
|
int expectedActiveStageCount = 0;
|
||||||
|
for (int i = 0; i < expectedStageCount; i++) {
|
||||||
|
if (activeStageFlags.get(i)) {
|
||||||
|
expectedActiveStageCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertTrue(config.getActiveStageCount() == expectedActiveStageCount);
|
||||||
|
int[] stages = config.getActiveStages();
|
||||||
|
assertTrue(stages.length == expectedActiveStageCount);
|
||||||
|
|
||||||
|
// test if isHead() detects first stage being active or inactive
|
||||||
|
if (activeStageFlags.get(0)) {
|
||||||
|
assertTrue(config.isHead());
|
||||||
|
} else {
|
||||||
|
assertFalse(config.isHead());
|
||||||
|
}
|
||||||
|
|
||||||
|
// test if isStageActive() detects stage x being active or inactive
|
||||||
|
for (int i = 0; i < expectedStageCount; i++) {
|
||||||
|
if (activeStageFlags.get(i)) {
|
||||||
|
assertTrue(config.isStageActive(i));
|
||||||
|
} else {
|
||||||
|
assertFalse(config.isStageActive(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// test boundary conditions
|
||||||
|
|
||||||
|
// stage -1 should not exist, and isStageActive() should throw exception
|
||||||
|
boolean IndexOutOfBoundsExceptionFlag = false;
|
||||||
|
try {
|
||||||
|
assertFalse(config.isStageActive(-1));
|
||||||
|
} catch (IndexOutOfBoundsException e) {
|
||||||
|
IndexOutOfBoundsExceptionFlag = true;
|
||||||
|
}
|
||||||
|
assertTrue(IndexOutOfBoundsExceptionFlag);
|
||||||
|
|
||||||
|
// n+1 stage should not exist, isStageActive() should return false
|
||||||
|
// TODO: isStageActive(stageCount + 1) really should throw IndexOutOfBoundsException
|
||||||
|
assertFalse(config.isStageActive(stageCount + 1));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////// Test Rocket Creation Methods /////////////////////////
|
||||||
|
|
||||||
|
public static Rocket makeEmptyRocket() {
|
||||||
|
Rocket rocket = new Rocket();
|
||||||
|
return rocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Rocket makeSingleStageTestRocket() {
|
||||||
|
|
||||||
|
// TODO: get units correct, these units are prob wrong, are lengths are CM, mass are grams
|
||||||
|
|
||||||
|
Rocket rocket;
|
||||||
|
Stage stage;
|
||||||
|
NoseCone nosecone;
|
||||||
|
BodyTube tube1;
|
||||||
|
TrapezoidFinSet finset;
|
||||||
|
|
||||||
|
// body tube constants
|
||||||
|
final double R = 2.5 / 2; // cm
|
||||||
|
final double BT_T = 0.1;
|
||||||
|
|
||||||
|
// nose cone constants
|
||||||
|
final double NC_T = 0.2;
|
||||||
|
final double R2 = 2.3 / 2;
|
||||||
|
|
||||||
|
rocket = new Rocket();
|
||||||
|
stage = new Stage();
|
||||||
|
stage.setName("Stage1");
|
||||||
|
|
||||||
|
nosecone = new NoseCone(Transition.Shape.OGIVE, 10.0, R);
|
||||||
|
nosecone.setThickness(NC_T);
|
||||||
|
nosecone.setAftShoulderLength(2.0);
|
||||||
|
nosecone.setAftShoulderRadius(R2);
|
||||||
|
nosecone.setAftShoulderThickness(NC_T);
|
||||||
|
nosecone.setAftShoulderCapped(true);
|
||||||
|
nosecone.setFilled(false);
|
||||||
|
stage.addChild(nosecone);
|
||||||
|
|
||||||
|
tube1 = new BodyTube(30, R, BT_T);
|
||||||
|
stage.addChild(tube1);
|
||||||
|
|
||||||
|
LaunchLug lug = new LaunchLug();
|
||||||
|
lug.setLength(3.5);
|
||||||
|
tube1.addChild(lug);
|
||||||
|
|
||||||
|
/*
|
||||||
|
TubeCoupler coupler = new TubeCoupler();
|
||||||
|
coupler.setOuterRadiusAutomatic(true);
|
||||||
|
coupler.setThickness(0.005);
|
||||||
|
coupler.setLength(0.28);
|
||||||
|
coupler.setMassOverridden(true);
|
||||||
|
coupler.setOverrideMass(0.360);
|
||||||
|
coupler.setRelativePosition(Position.BOTTOM);
|
||||||
|
coupler.setPositionValue(-0.14);
|
||||||
|
tube1.addChild(coupler);
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Parachute
|
||||||
|
MassComponent mass = new MassComponent(4.5, R2, 8.0);
|
||||||
|
mass.setRelativePosition(Position.TOP);
|
||||||
|
mass.setPositionValue(3.0);
|
||||||
|
tube1.addChild(mass);
|
||||||
|
|
||||||
|
// Cord
|
||||||
|
mass = new MassComponent(40.0, R2, 72);
|
||||||
|
mass.setRelativePosition(Position.TOP);
|
||||||
|
mass.setPositionValue(2.0);
|
||||||
|
tube1.addChild(mass);
|
||||||
|
|
||||||
|
// Motor mount
|
||||||
|
InnerTube inner = new InnerTube();
|
||||||
|
inner.setMotorMount(true);
|
||||||
|
inner.setPositionValue(0.5);
|
||||||
|
inner.setRelativePosition(Position.BOTTOM);
|
||||||
|
inner.setOuterRadius(1.9 / 2);
|
||||||
|
inner.setInnerRadius(1.8 / 2);
|
||||||
|
inner.setLength(7.5);
|
||||||
|
tube1.addChild(inner);
|
||||||
|
|
||||||
|
// Centering rings for motor mount
|
||||||
|
|
||||||
|
CenteringRing center = new CenteringRing();
|
||||||
|
center.setInnerRadiusAutomatic(true);
|
||||||
|
center.setOuterRadiusAutomatic(true);
|
||||||
|
center.setLength(0.005);
|
||||||
|
center.setMassOverridden(true);
|
||||||
|
center.setOverrideMass(0.038);
|
||||||
|
center.setRelativePosition(Position.BOTTOM);
|
||||||
|
center.setPositionValue(0.25);
|
||||||
|
tube1.addChild(center);
|
||||||
|
|
||||||
|
center = new CenteringRing();
|
||||||
|
center.setInnerRadiusAutomatic(true);
|
||||||
|
center.setOuterRadiusAutomatic(true);
|
||||||
|
center.setLength(0.005);
|
||||||
|
center.setMassOverridden(true);
|
||||||
|
center.setOverrideMass(0.038);
|
||||||
|
center.setRelativePosition(Position.BOTTOM);
|
||||||
|
center.setPositionValue(-6.0);
|
||||||
|
tube1.addChild(center);
|
||||||
|
|
||||||
|
|
||||||
|
center = new CenteringRing();
|
||||||
|
center.setInnerRadiusAutomatic(true);
|
||||||
|
center.setOuterRadiusAutomatic(true);
|
||||||
|
center.setLength(0.005);
|
||||||
|
center.setMassOverridden(true);
|
||||||
|
center.setOverrideMass(0.038);
|
||||||
|
center.setRelativePosition(Position.TOP);
|
||||||
|
center.setPositionValue(0.83);
|
||||||
|
tube1.addChild(center);
|
||||||
|
|
||||||
|
// Fins
|
||||||
|
finset = new TrapezoidFinSet();
|
||||||
|
finset.setFinCount(3);
|
||||||
|
finset.setRootChord(5.0);
|
||||||
|
finset.setTipChord(5.0);
|
||||||
|
finset.setHeight(3.0);
|
||||||
|
finset.setThickness(0.005);
|
||||||
|
finset.setSweepAngle(40.0);
|
||||||
|
finset.setRelativePosition(Position.BOTTOM);
|
||||||
|
finset.setPositionValue(-0.5);
|
||||||
|
finset.setBaseRotation(Math.PI / 2);
|
||||||
|
tube1.addChild(finset);
|
||||||
|
|
||||||
|
// Stage construction
|
||||||
|
rocket.addChild(stage);
|
||||||
|
rocket.setPerfectFinish(false);
|
||||||
|
|
||||||
|
// Flight configuration
|
||||||
|
String id = rocket.newFlightConfigurationID();
|
||||||
|
|
||||||
|
// Motor m = Application.getMotorSetDatabase().findMotors(null, null, "L540", Double.NaN, Double.NaN).get(0);
|
||||||
|
// tube3.setMotor(id, m);
|
||||||
|
// tube3.setMotorOverhang(0.02);
|
||||||
|
rocket.getDefaultConfiguration().setFlightConfigurationID(id);
|
||||||
|
|
||||||
|
// tube3.setIgnitionEvent(MotorMount.IgnitionEvent.NEVER);
|
||||||
|
|
||||||
|
rocket.getDefaultConfiguration().setAllStages();
|
||||||
|
|
||||||
|
return rocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static Rocket makeTwoStageTestRocket() {
|
||||||
|
|
||||||
|
// TODO: get units correct, these units are prob wrong, are lengths are CM, mass are grams
|
||||||
|
|
||||||
|
final double R = 2.5 / 2; // cm
|
||||||
|
final double BT_T = 0.1;
|
||||||
|
|
||||||
|
Rocket rocket = makeSingleStageTestRocket();
|
||||||
|
|
||||||
|
Stage stage = new Stage();
|
||||||
|
stage.setName("Booster");
|
||||||
|
|
||||||
|
BodyTube boosterTube = new BodyTube(9.0, R, BT_T);
|
||||||
|
stage.addChild(boosterTube);
|
||||||
|
|
||||||
|
TubeCoupler coupler = new TubeCoupler();
|
||||||
|
coupler.setOuterRadiusAutomatic(true);
|
||||||
|
coupler.setThickness(BT_T);
|
||||||
|
coupler.setLength(3.0);
|
||||||
|
coupler.setRelativePosition(Position.TOP);
|
||||||
|
coupler.setPositionValue(-1.5);
|
||||||
|
boosterTube.addChild(coupler);
|
||||||
|
|
||||||
|
TrapezoidFinSet finset = new TrapezoidFinSet();
|
||||||
|
finset.setFinCount(3);
|
||||||
|
finset.setRootChord(5.0);
|
||||||
|
finset.setTipChord(5.0);
|
||||||
|
finset.setHeight(3.0);
|
||||||
|
finset.setThickness(0.005);
|
||||||
|
finset.setSweepAngle(40.0);
|
||||||
|
finset.setRelativePosition(Position.BOTTOM);
|
||||||
|
finset.setPositionValue(-0.25);
|
||||||
|
finset.setBaseRotation(Math.PI / 2);
|
||||||
|
boosterTube.addChild(finset);
|
||||||
|
|
||||||
|
rocket.addChild(stage);
|
||||||
|
|
||||||
|
return rocket;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user