version 1.1.9
This commit is contained in:
parent
d82a370dd4
commit
ab9bf0bce3
10
ChangeLog
10
ChangeLog
@ -1,6 +1,14 @@
|
|||||||
|
2011-11-24 Sampo Niskanen
|
||||||
|
|
||||||
|
* Released version 1.1.9
|
||||||
|
|
||||||
2011-11-18 Doug Pedrick
|
2011-11-18 Doug Pedrick
|
||||||
|
|
||||||
* Printable Fin Marking Guides, Transitions, and Nose Cones (simple projection only)
|
* Printable Fin Marking Guides, Transitions, and Nose Cones
|
||||||
|
|
||||||
|
2011-10-20 Sampo Niskanen
|
||||||
|
|
||||||
|
* [BUG] NPE if plot data type is not present
|
||||||
|
|
||||||
2011-10-11 Sampo Niskanen
|
2011-10-11 Sampo Niskanen
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
OpenRocket - an Open Source model rocket simulator
|
OpenRocket - an Open Source model rocket simulator
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
Copyright (C) 2007-2010 Sampo Niskanen
|
Copyright (C) 2007-2011 Sampo Niskanen
|
||||||
|
|
||||||
|
|
||||||
For license information see the file LICENSE.TXT.
|
For license information see the file LICENSE.TXT.
|
||||||
@ -25,5 +25,8 @@ Contributions have been made by:
|
|||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
Sampo Niskanen, main developer
|
Sampo Niskanen, main developer
|
||||||
Doug Pedrick, support for reading RockSim designs
|
Doug Pedrick, support for reading RockSim designs, printing
|
||||||
|
Richard Graham, geodetic computations
|
||||||
|
Boris du Reau, internationalization
|
||||||
|
Tripoli France, Tripoli Spain, Stefan Lobas / ERIG, translations
|
||||||
|
|
||||||
|
|||||||
10
ReleaseNotes
10
ReleaseNotes
@ -1,3 +1,13 @@
|
|||||||
|
OpenRocket 1.1.9 (2011-11-24):
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
This release calculates rocket flight in real-world coordinates and
|
||||||
|
takes into account geodetic effects (including coriolis effect) thanks
|
||||||
|
to work by Richard Graham. Printing of transitions, nose cone
|
||||||
|
profiles and fin marking guides is available thanks to Doug Pedrick.
|
||||||
|
It also contains some usability features and bug fixes.
|
||||||
|
|
||||||
|
|
||||||
OpenRocket 1.1.8 (2011-08-25):
|
OpenRocket 1.1.8 (2011-08-25):
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
# The OpenRocket build version
|
# The OpenRocket build version
|
||||||
|
|
||||||
build.version=1.1.9pre
|
build.version=1.1.9
|
||||||
|
|
||||||
|
|
||||||
# The source of the package. When building a package for a specific
|
# The source of the package. When building a package for a specific
|
||||||
|
|||||||
@ -30,7 +30,8 @@ public class AboutDialog extends JDialog {
|
|||||||
"<font size=\"+1\"><b>OpenRocket has been developed by:</b></font><br><br>" +
|
"<font size=\"+1\"><b>OpenRocket has been developed by:</b></font><br><br>" +
|
||||||
"Sampo Niskanen (main developer)<br>" +
|
"Sampo Niskanen (main developer)<br>" +
|
||||||
"Doug Pedrick (RockSim file format, printing)<br>" +
|
"Doug Pedrick (RockSim file format, printing)<br>" +
|
||||||
"Boris du Reau (internationalization, translation lead)<br><br>" +
|
"Boris du Reau (internationalization, translation lead)<br>" +
|
||||||
|
"Richard Graham (geodetic computations)<br><br>" +
|
||||||
"<b>Translations by:</b><br><br>" +
|
"<b>Translations by:</b><br><br>" +
|
||||||
"Tripoli France (French)<br>" +
|
"Tripoli France (French)<br>" +
|
||||||
"Stefan Lobas / ERIG e.V. (German)<br>" +
|
"Stefan Lobas / ERIG e.V. (German)<br>" +
|
||||||
|
|||||||
@ -88,8 +88,6 @@ public class SimulationEditDialog extends JDialog {
|
|||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
|
|
||||||
// FIXME: NPE if FlightDataType has disappeared
|
|
||||||
|
|
||||||
public SimulationEditDialog(Window parent, Simulation s) {
|
public SimulationEditDialog(Window parent, Simulation s) {
|
||||||
this(parent, s, 0);
|
this(parent, s, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -123,7 +123,7 @@ public class SimulationRunDialog extends JDialog {
|
|||||||
//// Simulation time:
|
//// Simulation time:
|
||||||
panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Simutime") + " "), "gapright para");
|
panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Simutime") + " "), "gapright para");
|
||||||
timeLabel = new JLabel("");
|
timeLabel = new JLabel("");
|
||||||
panel.add(timeLabel, "growx, wrap rel");
|
panel.add(timeLabel, "growx, wmin 200lp, wrap rel");
|
||||||
|
|
||||||
//// Altitude:
|
//// Altitude:
|
||||||
panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Altitude") + " "));
|
panel.add(new JLabel(trans.get("SimuRunDlg.lbl.Altitude") + " "));
|
||||||
|
|||||||
@ -118,8 +118,6 @@ public class SimulationPlotPanel extends JPanel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Bugs when expected branch is not present
|
|
||||||
|
|
||||||
configurationSelector.addItemListener(new ItemListener() {
|
configurationSelector.addItemListener(new ItemListener() {
|
||||||
@Override
|
@Override
|
||||||
public void itemStateChanged(ItemEvent e) {
|
public void itemStateChanged(ItemEvent e) {
|
||||||
@ -189,7 +187,7 @@ public class SimulationPlotPanel extends JPanel {
|
|||||||
|
|
||||||
typeSelectorPanel = new JPanel(new MigLayout("gapy rel"));
|
typeSelectorPanel = new JPanel(new MigLayout("gapy rel"));
|
||||||
JScrollPane scroll = new JScrollPane(typeSelectorPanel);
|
JScrollPane scroll = new JScrollPane(typeSelectorPanel);
|
||||||
this.add(scroll, "spany 2, height 10px, grow 100, gapright para");
|
this.add(scroll, "spany 2, height 10px, wmin 400lp, grow 100, gapright para");
|
||||||
|
|
||||||
|
|
||||||
//// Flight events
|
//// Flight events
|
||||||
@ -379,10 +377,6 @@ public class SimulationPlotPanel extends JPanel {
|
|||||||
private JComboBox axisSelector;
|
private JComboBox axisSelector;
|
||||||
|
|
||||||
|
|
||||||
public PlotTypeSelector(int index, FlightDataType type) {
|
|
||||||
this(index, type, null, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public PlotTypeSelector(int plotIndex, FlightDataType type, Unit unit, int position) {
|
public PlotTypeSelector(int plotIndex, FlightDataType type, Unit unit, int position) {
|
||||||
super(new MigLayout("ins 0"));
|
super(new MigLayout("ins 0"));
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,6 @@ package net.sf.openrocket.gui.print;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
import net.sf.openrocket.document.Simulation;
|
import net.sf.openrocket.document.Simulation;
|
||||||
@ -152,7 +149,7 @@ public class DesignReport {
|
|||||||
PrintUtilities.addText(document, PrintUtilities.BIG_BOLD, ROCKET_DESIGN);
|
PrintUtilities.addText(document, PrintUtilities.BIG_BOLD, ROCKET_DESIGN);
|
||||||
|
|
||||||
Rocket rocket = rocketDocument.getRocket();
|
Rocket rocket = rocketDocument.getRocket();
|
||||||
final Configuration configuration = rocket.getDefaultConfiguration();
|
final Configuration configuration = rocket.getDefaultConfiguration().clone();
|
||||||
configuration.setAllStages();
|
configuration.setAllStages();
|
||||||
PdfContentByte canvas = writer.getDirectContent();
|
PdfContentByte canvas = writer.getDirectContent();
|
||||||
|
|
||||||
@ -219,8 +216,6 @@ public class DesignReport {
|
|||||||
|
|
||||||
String[] motorIds = rocket.getMotorConfigurationIDs();
|
String[] motorIds = rocket.getMotorConfigurationIDs();
|
||||||
|
|
||||||
List<Double> stageMasses = getStageMasses(rocket);
|
|
||||||
|
|
||||||
for (int j = 0; j < motorIds.length; j++) {
|
for (int j = 0; j < motorIds.length; j++) {
|
||||||
String motorId = motorIds[j];
|
String motorId = motorIds[j];
|
||||||
if (motorId != null) {
|
if (motorId != null) {
|
||||||
@ -244,29 +239,6 @@ public class DesignReport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the motor list for all motor mounts.
|
|
||||||
*
|
|
||||||
* @param theRocket the rocket object
|
|
||||||
* @param theMid the motor id
|
|
||||||
*
|
|
||||||
* @return a list of Motor
|
|
||||||
*/
|
|
||||||
private List<Motor> getMotorList(final Rocket theRocket, final String theMid) {
|
|
||||||
Iterator<RocketComponent> components = theRocket.iterator();
|
|
||||||
final List<Motor> motorList = new ArrayList<Motor>();
|
|
||||||
while (components.hasNext()) {
|
|
||||||
RocketComponent rocketComponent = components.next();
|
|
||||||
if (rocketComponent instanceof MotorMount) {
|
|
||||||
MotorMount mm = (MotorMount) rocketComponent;
|
|
||||||
final Motor motor = mm.getMotor(theMid);
|
|
||||||
if (motor != null) {
|
|
||||||
motorList.add(motor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return motorList;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paint a diagram of the rocket into the PDF document.
|
* Paint a diagram of the rocket into the PDF document.
|
||||||
@ -545,27 +517,4 @@ public class DesignReport {
|
|||||||
return target.replace("]", "");
|
return target.replace("]", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a list of cumulative stage masses. The latter masses include the mass
|
|
||||||
* of the upper stages as well.
|
|
||||||
*
|
|
||||||
* @param rocket the rocket
|
|
||||||
* @return a list containing the cumulative stage masses
|
|
||||||
*/
|
|
||||||
private List<Double> getStageMasses(final Rocket rocket) {
|
|
||||||
List<Double> masses = new ArrayList<Double>();
|
|
||||||
int stages = rocket.getStageCount();
|
|
||||||
|
|
||||||
Configuration config = new Configuration(rocket);
|
|
||||||
MassCalculator calc = new BasicMassCalculator();
|
|
||||||
|
|
||||||
for (int i = 0; i < stages; i++) {
|
|
||||||
config.setToStage(i);
|
|
||||||
masses.add(calc.getCG(config, MassCalcType.NO_MOTORS).weight);
|
|
||||||
}
|
|
||||||
|
|
||||||
return masses;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,16 +17,17 @@ public class PrintFigure extends RocketFigure {
|
|||||||
*
|
*
|
||||||
* @param configuration the configuration
|
* @param configuration the configuration
|
||||||
*/
|
*/
|
||||||
public PrintFigure (final Configuration configuration) {
|
public PrintFigure(final Configuration configuration) {
|
||||||
super(configuration);
|
super(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected double computeTy (int heightPx) {
|
@Override
|
||||||
|
protected double computeTy(int heightPx) {
|
||||||
super.computeTy(heightPx);
|
super.computeTy(heightPx);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScale (final double theScale) {
|
public void setScale(final double theScale) {
|
||||||
this.scale = theScale; //dpi/0.0254*scaling;
|
this.scale = theScale; //dpi/0.0254*scaling;
|
||||||
updateFigure();
|
updateFigure();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,11 @@
|
|||||||
*/
|
*/
|
||||||
package net.sf.openrocket.gui.print;
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeMap;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instances of this class are meant to keep track of what the user has selected to be printed.
|
* Instances of this class are meant to keep track of what the user has selected to be printed.
|
||||||
@ -29,7 +33,7 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
public PrintableContext () {
|
public PrintableContext() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,7 +44,7 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
*
|
*
|
||||||
* @throws IllegalArgumentException thrown if thePrintable.isStageSpecific
|
* @throws IllegalArgumentException thrown if thePrintable.isStageSpecific
|
||||||
*/
|
*/
|
||||||
private PrintableContext (final Set<Integer> theStageNumber, final OpenRocketPrintable thePrintable)
|
private PrintableContext(final Set<Integer> theStageNumber, final OpenRocketPrintable thePrintable)
|
||||||
throws IllegalArgumentException {
|
throws IllegalArgumentException {
|
||||||
if (thePrintable.isStageSpecific() && theStageNumber == null) {
|
if (thePrintable.isStageSpecific() && theStageNumber == null) {
|
||||||
throw new IllegalArgumentException("A stage number must be provided when a printable is stage specific.");
|
throw new IllegalArgumentException("A stage number must be provided when a printable is stage specific.");
|
||||||
@ -55,7 +59,7 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
* @param theStageNumber the stage number
|
* @param theStageNumber the stage number
|
||||||
* @param thePrintable the printable to associate with the stage
|
* @param thePrintable the printable to associate with the stage
|
||||||
*/
|
*/
|
||||||
public void add (final Integer theStageNumber, final OpenRocketPrintable thePrintable) {
|
public void add(final Integer theStageNumber, final OpenRocketPrintable thePrintable) {
|
||||||
Set<Integer> stages = previous.get(thePrintable);
|
Set<Integer> stages = previous.get(thePrintable);
|
||||||
if (stages == null) {
|
if (stages == null) {
|
||||||
stages = new TreeSet<Integer>();
|
stages = new TreeSet<Integer>();
|
||||||
@ -67,24 +71,25 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** PrintableContext iterator. */
|
/** PrintableContext iterator. */
|
||||||
public Iterator<PrintableContext> iterator () {
|
@Override
|
||||||
|
public Iterator<PrintableContext> iterator() {
|
||||||
return new Iterator<PrintableContext>() {
|
return new Iterator<PrintableContext>() {
|
||||||
|
|
||||||
Iterator<OpenRocketPrintable> keyIter = previous.keySet().iterator();
|
Iterator<OpenRocketPrintable> keyIter = previous.keySet().iterator();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext () {
|
public boolean hasNext() {
|
||||||
return keyIter.hasNext();
|
return keyIter.hasNext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PrintableContext next () {
|
public PrintableContext next() {
|
||||||
final OpenRocketPrintable key = keyIter.next();
|
final OpenRocketPrintable key = keyIter.next();
|
||||||
return new PrintableContext(previous.get(key), key);
|
return new PrintableContext(previous.get(key), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove () {
|
public void remove() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -95,7 +100,7 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
*
|
*
|
||||||
* @return the stage number
|
* @return the stage number
|
||||||
*/
|
*/
|
||||||
public Set<Integer> getStageNumber () {
|
public Set<Integer> getStageNumber() {
|
||||||
return stageNumber;
|
return stageNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,12 +109,12 @@ public class PrintableContext implements Comparable<PrintableContext>, Iterable<
|
|||||||
*
|
*
|
||||||
* @return the printable
|
* @return the printable
|
||||||
*/
|
*/
|
||||||
public OpenRocketPrintable getPrintable () {
|
public OpenRocketPrintable getPrintable() {
|
||||||
return printable;
|
return printable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo (final PrintableContext other) {
|
public int compareTo(final PrintableContext other) {
|
||||||
return this.printable.getPrintOrder() - other.printable.getPrintOrder();
|
return this.printable.getPrintOrder() - other.printable.getPrintOrder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,14 @@
|
|||||||
package net.sf.openrocket.gui.print;
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.Shape;
|
||||||
|
|
||||||
import net.sf.openrocket.gui.rocketfigure.TransitionShapes;
|
import net.sf.openrocket.gui.rocketfigure.TransitionShapes;
|
||||||
import net.sf.openrocket.rocketcomponent.NoseCone;
|
import net.sf.openrocket.rocketcomponent.NoseCone;
|
||||||
import net.sf.openrocket.rocketcomponent.Transition;
|
import net.sf.openrocket.rocketcomponent.Transition;
|
||||||
import net.sf.openrocket.util.Transformation;
|
import net.sf.openrocket.util.Transformation;
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
|
|
||||||
public class PrintableNoseCone extends AbstractPrintableTransition {
|
public class PrintableNoseCone extends AbstractPrintableTransition {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,6 +42,7 @@ public class PrintableNoseCone extends AbstractPrintableTransition {
|
|||||||
*
|
*
|
||||||
* @param g2 the graphics context
|
* @param g2 the graphics context
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected void draw(Graphics2D g2) {
|
protected void draw(Graphics2D g2) {
|
||||||
Shape[] shapes = TransitionShapes.getShapesSide(target, Transformation.rotate_x(0d), PrintUnit.METERS.toPoints(1));
|
Shape[] shapes = TransitionShapes.getShapesSide(target, Transformation.rotate_x(0d), PrintUnit.METERS.toPoints(1));
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +1,15 @@
|
|||||||
package net.sf.openrocket.gui.print;
|
package net.sf.openrocket.gui.print;
|
||||||
|
|
||||||
import net.sf.openrocket.rocketcomponent.Transition;
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.geom.Arc2D;
|
import java.awt.geom.Arc2D;
|
||||||
import java.awt.geom.GeneralPath;
|
import java.awt.geom.GeneralPath;
|
||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
import java.awt.geom.Path2D;
|
import java.awt.geom.Path2D;
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
|
|
||||||
|
import net.sf.openrocket.rocketcomponent.Transition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class allows for a Transition to be printable. It does so by decorating an existing transition (which will not be
|
* This class allows for a Transition to be printable. It does so by decorating an existing transition (which will not be
|
||||||
* modified) and rendering it within a JPanel. The JPanel is not actually visualized on a display, but instead renders
|
* modified) and rendering it within a JPanel. The JPanel is not actually visualized on a display, but instead renders
|
||||||
@ -22,7 +23,7 @@ public class PrintableTransition extends AbstractPrintableTransition {
|
|||||||
/**
|
/**
|
||||||
* Dashed array value.
|
* Dashed array value.
|
||||||
*/
|
*/
|
||||||
private final static float dash1[] = {4.0f};
|
private final static float dash1[] = { 4.0f };
|
||||||
/**
|
/**
|
||||||
* The dashed stroke for glue tab.
|
* The dashed stroke for glue tab.
|
||||||
*/
|
*/
|
||||||
@ -184,6 +185,7 @@ public class PrintableTransition extends AbstractPrintableTransition {
|
|||||||
*
|
*
|
||||||
* @param g2 the graphics context
|
* @param g2 the graphics context
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
protected void draw(Graphics2D g2) {
|
protected void draw(Graphics2D g2) {
|
||||||
//Render it.
|
//Render it.
|
||||||
g2.draw(gp);
|
g2.draw(gp);
|
||||||
|
|||||||
@ -109,7 +109,6 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
|
|||||||
|
|
||||||
|
|
||||||
private SimulationWorker backgroundSimulationWorker = null;
|
private SimulationWorker backgroundSimulationWorker = null;
|
||||||
private boolean dirty = false;
|
|
||||||
|
|
||||||
private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
|
private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
package net.sf.openrocket.models.gravity;
|
package net.sf.openrocket.models.gravity;
|
||||||
|
|
||||||
//import net.sf.openrocket.util.Monitorable;
|
|
||||||
import net.sf.openrocket.util.Monitorable;
|
import net.sf.openrocket.util.Monitorable;
|
||||||
import net.sf.openrocket.util.WorldCoordinate;
|
import net.sf.openrocket.util.WorldCoordinate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An interface to modelling gravitational acceleration.
|
* An interface for modeling gravitational acceleration.
|
||||||
*
|
*
|
||||||
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
|
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
|
||||||
*/
|
*/
|
||||||
public interface GravityModel extends Monitorable {
|
public interface GravityModel extends Monitorable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the gravity at a given world coordinate
|
* Compute the gravitational acceleration at a given world coordinate
|
||||||
|
*
|
||||||
* @param wc the world coordinate location
|
* @param wc the world coordinate location
|
||||||
* @return gravitational acceleration in m/s/s
|
* @return gravitational acceleration in m/s/s
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import net.sf.openrocket.util.MathUtil;
|
|||||||
import net.sf.openrocket.util.WorldCoordinate;
|
import net.sf.openrocket.util.WorldCoordinate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A gravity model based on the WGS84 elipsoid.
|
* A gravity model based on the WGS84 ellipsoid.
|
||||||
*
|
*
|
||||||
* @author Richard Graham <richard@rdg.cc>
|
* @author Richard Graham <richard@rdg.cc>
|
||||||
*/
|
*/
|
||||||
@ -44,7 +44,7 @@ public class WGSGravityModel implements GravityModel {
|
|||||||
// Apply correction due to altitude. Note this assumes a spherical earth, but it is a small correction
|
// Apply correction due to altitude. Note this assumes a spherical earth, but it is a small correction
|
||||||
// so it probably doesn't really matter. Also does not take into account gravity of the atmosphere, again
|
// so it probably doesn't really matter. Also does not take into account gravity of the atmosphere, again
|
||||||
// correction could be done but not really necessary.
|
// correction could be done but not really necessary.
|
||||||
double g_alt = g_0 * Math.pow(WorldCoordinate.REARTH / (WorldCoordinate.REARTH + wc.getAltitude()), 2);
|
double g_alt = g_0 * MathUtil.pow2(WorldCoordinate.REARTH / (WorldCoordinate.REARTH + wc.getAltitude()));
|
||||||
|
|
||||||
return g_alt;
|
return g_alt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -93,8 +93,6 @@ public abstract class AbstractSimulationStepper implements SimulationStepper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Compute conditions
|
// Compute conditions
|
||||||
//double altitude = status.getRocketPosition().z + status.getSimulationConditions().getLaunchAltitude();
|
|
||||||
//gravity = status.getSimulationConditions().getGravityModel().getGravity(altitude);
|
|
||||||
gravity = status.getSimulationConditions().getGravityModel().getGravity(status.getRocketWorldPosition());
|
gravity = status.getSimulationConditions().getGravityModel().getGravity(status.getRocketWorldPosition());
|
||||||
|
|
||||||
// Call post-listener
|
// Call post-listener
|
||||||
|
|||||||
@ -54,7 +54,7 @@ public enum GeodeticComputationStrategy {
|
|||||||
double newAlt = location.getAltitude() + delta.z;
|
double newAlt = location.getAltitude() + delta.z;
|
||||||
|
|
||||||
// bearing (in radians, clockwise from north);
|
// bearing (in radians, clockwise from north);
|
||||||
// d/R is the angular distance (in radians), where d is the distance traveled and R is the earth’s radius
|
// d/R is the angular distance (in radians), where d is the distance traveled and R is the earth's radius
|
||||||
double d = MathUtil.hypot(delta.x, delta.y);
|
double d = MathUtil.hypot(delta.x, delta.y);
|
||||||
|
|
||||||
// Check for zero movement before computing bearing
|
// Check for zero movement before computing bearing
|
||||||
@ -99,7 +99,7 @@ public enum GeodeticComputationStrategy {
|
|||||||
double newAlt = location.getAltitude() + delta.z;
|
double newAlt = location.getAltitude() + delta.z;
|
||||||
|
|
||||||
// bearing (in radians, clockwise from north);
|
// bearing (in radians, clockwise from north);
|
||||||
// d/R is the angular distance (in radians), where d is the distance traveled and R is the earth’s radius
|
// d/R is the angular distance (in radians), where d is the distance traveled and R is the earth's radius
|
||||||
double d = MathUtil.hypot(delta.x, delta.y);
|
double d = MathUtil.hypot(delta.x, delta.y);
|
||||||
|
|
||||||
// Check for zero movement before computing bearing
|
// Check for zero movement before computing bearing
|
||||||
|
|||||||
@ -25,10 +25,6 @@ public enum LineStyle {
|
|||||||
DASHDOT("LineStyle.Dash-dotted", new float[] { 8f, 3f, 2f, 3f });
|
DASHDOT("LineStyle.Dash-dotted", new float[] { 8f, 3f, 2f, 3f });
|
||||||
|
|
||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
static {
|
|
||||||
System.out.println("*** LineStyle initialized trans:" + trans + " ***");
|
|
||||||
System.err.println("*** LineStyle initialized ***");
|
|
||||||
}
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final float[] dashes;
|
private final float[] dashes;
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,42 @@
|
|||||||
|
package net.sf.openrocket.models.gravity;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import net.sf.openrocket.util.WorldCoordinate;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
|
||||||
|
public class WGSGravityModelTest {
|
||||||
|
|
||||||
|
private WGSGravityModel model = new WGSGravityModel();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSurfaceGravity() {
|
||||||
|
// Equator
|
||||||
|
test(0, 0, 0, 9.780);
|
||||||
|
// Mid-latitude
|
||||||
|
test(45, 0, 0, 9.806);
|
||||||
|
// Mid-latitude
|
||||||
|
test(45, 99, 0, 9.806);
|
||||||
|
// South pole
|
||||||
|
test(-90, 0, 0, 9.832);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAltitudeEffect() {
|
||||||
|
test(45, 0, -100, 9.806);
|
||||||
|
test(45, 0, 0, 9.806);
|
||||||
|
test(45, 0, 10, 9.806);
|
||||||
|
test(45, 0, 100, 9.806);
|
||||||
|
test(45, 0, 1000, 9.803);
|
||||||
|
test(45, 0, 10000, 9.775);
|
||||||
|
test(45, 0, 100000, 9.505);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void test(double lat, double lon, double alt, double g) {
|
||||||
|
WorldCoordinate wc = new WorldCoordinate(lat, lon, alt);
|
||||||
|
assertEquals(g, model.getGravity(wc), 0.001);
|
||||||
|
assertEquals(g, model.getGravity(wc), 0.001);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -45,6 +45,7 @@ public class GeodeticComputationStrategyTest {
|
|||||||
|
|
||||||
|
|
||||||
// Test zero movement
|
// Test zero movement
|
||||||
|
System.out.println("\nTesting zero movement");
|
||||||
testAddCoordinate(50.0, 20.0, 0, 123, 50.0, 20.0, false);
|
testAddCoordinate(50.0, 20.0, 0, 123, 50.0, 20.0, false);
|
||||||
|
|
||||||
|
|
||||||
@ -55,22 +56,27 @@ public class GeodeticComputationStrategyTest {
|
|||||||
|
|
||||||
// Long distance NE over England, crosses Greenwich meridian
|
// Long distance NE over England, crosses Greenwich meridian
|
||||||
// 50 03N 005 42W to 58 38N 003 04E is 1109km at 027 16'07"
|
// 50 03N 005 42W to 58 38N 003 04E is 1109km at 027 16'07"
|
||||||
|
System.out.println("\nTesting 1109km NE over England");
|
||||||
testAddCoordinate(50 + 3 * min, -5 - 42 * min, 1109000, 27 + 16 * min + 7 * sec, 58 + 38 * min, 3 + 4 * min, false);
|
testAddCoordinate(50 + 3 * min, -5 - 42 * min, 1109000, 27 + 16 * min + 7 * sec, 58 + 38 * min, 3 + 4 * min, false);
|
||||||
|
|
||||||
// SW over Brazil
|
// SW over Brazil
|
||||||
// -10N -60E to -11N -61E is 155.9km at 224 25'34"
|
// -10N -60E to -11N -61E is 155.9km at 224 25'34"
|
||||||
|
System.out.println("\nTesting 155km SW over Brazil");
|
||||||
testAddCoordinate(-10, -60, 155900, 224 + 25 * min + 34 * sec, -11, -61, true);
|
testAddCoordinate(-10, -60, 155900, 224 + 25 * min + 34 * sec, -11, -61, true);
|
||||||
|
|
||||||
// NW over the 180 meridian
|
// NW over the 180 meridian
|
||||||
// 63N -179E to 63 01N 179E is 100.9km at 271 56'34"
|
// 63N -179E to 63 01N 179E is 100.9km at 271 56'34"
|
||||||
|
System.out.println("\nTesting 100km NW over 180 meridian");
|
||||||
testAddCoordinate(63, -179, 100900, 271 + 56 * min + 34 * sec, 63 + 1 * min, 179, true);
|
testAddCoordinate(63, -179, 100900, 271 + 56 * min + 34 * sec, 63 + 1 * min, 179, true);
|
||||||
|
|
||||||
// NE near the north pole
|
// NE near the north pole
|
||||||
// 89 50N 0E to 89 45N 175E is 46.29 km at 003 00'01"
|
// 89 50N 0E to 89 45N 175E is 46.29 km at 003 00'01"
|
||||||
|
System.out.println("\nTesting 46km NE near north pole");
|
||||||
testAddCoordinate(89 + 50 * min, 0, 46290, 3 + 0 * min + 1 * sec, 89 + 45 * min, 175, false);
|
testAddCoordinate(89 + 50 * min, 0, 46290, 3 + 0 * min + 1 * sec, 89 + 45 * min, 175, false);
|
||||||
|
|
||||||
// S directly over south pole
|
// S directly over south pole
|
||||||
// -89 50N 12E to -89 45N 192E is 46.33km at 180 00'00"
|
// -89 50N 12E to -89 45N 192E is 46.33km at 180 00'00"
|
||||||
|
System.out.println("\nTesting 46km directly over south pole ");
|
||||||
testAddCoordinate(-89 - 50 * min, 12, 46330, 180, -89 - 45 * min, -168, false);
|
testAddCoordinate(-89 - 50 * min, 12, 46330, 180, -89 - 45 * min, -168, false);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -103,20 +109,20 @@ public class GeodeticComputationStrategyTest {
|
|||||||
|
|
||||||
// Test WGS84
|
// Test WGS84
|
||||||
/*
|
/*
|
||||||
* TODO: Since the example values are computed using a spherical earth approximation,
|
* Note: Since the example values are computed using a spherical earth approximation,
|
||||||
* the WGS84 method will have significantly larger errors. The tolerance should be
|
* the WGS84 method will have significantly larger errors. A tolerance of 1% accommodates
|
||||||
* increased correspondingly.
|
* all cases except the NE flight near the north pole, where the ellipsoidal effect is
|
||||||
|
* the greatest.
|
||||||
*/
|
*/
|
||||||
//tolerance = ...
|
tolerance = 0.04 * distance / 111325;
|
||||||
System.out.println("\nWGS84 tolerance: " + tolerance);
|
System.out.println("\nWGS84 tolerance: " + tolerance);
|
||||||
result = GeodeticComputationStrategy.WGS84.addCoordinate(result, coord);
|
result = GeodeticComputationStrategy.WGS84.addCoordinate(wc, coord);
|
||||||
|
|
||||||
System.out.println("Difference Lat: " + Math.abs(finalLatitude - result.getLatitudeDeg()));
|
System.out.println("Difference Lat: " + Math.abs(finalLatitude - result.getLatitudeDeg()));
|
||||||
System.out.println("Difference Lon: " + Math.abs(finalLongitude - result.getLongitudeDeg()));
|
System.out.println("Difference Lon: " + Math.abs(finalLongitude - result.getLongitudeDeg()));
|
||||||
// FIXME: Re-enable these when they function
|
assertEquals(finalLatitude, result.getLatitudeDeg(), tolerance);
|
||||||
// assertEquals(finalLatitude, result.getLatitudeDeg(), tolerance);
|
assertEquals(finalLongitude, result.getLongitudeDeg(), tolerance);
|
||||||
// assertEquals(finalLongitude, result.getLongitudeDeg(), tolerance);
|
assertEquals(1000.0, result.getAltitude(), 0.0);
|
||||||
// assertEquals(1000.0, result.getAltitude(), 0.0);
|
|
||||||
|
|
||||||
|
|
||||||
// Test FLAT
|
// Test FLAT
|
||||||
|
|||||||
@ -80,21 +80,33 @@ header("Content-type: text/plain");
|
|||||||
$version = $_GET["version"];
|
$version = $_GET["version"];
|
||||||
$updates = "";
|
$updates = "";
|
||||||
|
|
||||||
$unstable = "1.1.8";
|
$unstable = "1.1.9";
|
||||||
$stable = "1.0.0";
|
$stable = "1.0.0";
|
||||||
|
|
||||||
if (preg_match("/^1\.1\.7/", $version)) {
|
if (preg_match("/^1\.1\.8/", $version)) {
|
||||||
$updates = "Version: " . $unstable . "\n" .
|
$updates = "Version: " . $unstable . "\n" .
|
||||||
|
"6: Additional template printing\n" .
|
||||||
|
"5: Geodetic computations\n" .
|
||||||
|
"4: Bug fixes\n" .
|
||||||
|
"";
|
||||||
|
} else if (preg_match("/^1\.1\.7/", $version)) {
|
||||||
|
$updates = "Version: " . $unstable . "\n" .
|
||||||
|
"6: Additional template printing\n" .
|
||||||
|
"5: Geodetic computations\n" .
|
||||||
"4: Bug fixes\n" .
|
"4: Bug fixes\n" .
|
||||||
"";
|
"";
|
||||||
} else if (preg_match("/^1\.1\.6/", $version)) {
|
} else if (preg_match("/^1\.1\.6/", $version)) {
|
||||||
$updates = "Version: " . $unstable . "\n" .
|
$updates = "Version: " . $unstable . "\n" .
|
||||||
"8: Automatic rocket design optimization\n" .
|
"8: Automatic rocket design optimization\n" .
|
||||||
|
"6: Additional template printing\n" .
|
||||||
|
"5: Geodetic computations\n" .
|
||||||
"";
|
"";
|
||||||
} else if (preg_match("/^1\.1\.5/", $version)) {
|
} else if (preg_match("/^1\.1\.5/", $version)) {
|
||||||
$updates = "Version: " . $unstable . "\n" .
|
$updates = "Version: " . $unstable . "\n" .
|
||||||
"8: Automatic rocket design optimization\n" .
|
"8: Automatic rocket design optimization\n" .
|
||||||
"6: Initial localization support\n" .
|
"6: Initial localization support\n" .
|
||||||
|
"6: Additional template printing\n" .
|
||||||
|
"5: Geodetic computations\n" .
|
||||||
"5: Scaling support\n" .
|
"5: Scaling support\n" .
|
||||||
"4: Bug fixes\n" .
|
"4: Bug fixes\n" .
|
||||||
"";
|
"";
|
||||||
|
|||||||
@ -48,6 +48,18 @@
|
|||||||
<div class="content">
|
<div class="content">
|
||||||
<div class="news">
|
<div class="news">
|
||||||
<h2>Recent news:</h2>
|
<h2>Recent news:</h2>
|
||||||
|
<p><span class="date">24.11.2011:</span> Version 1.1.9 is
|
||||||
|
<a href="download.html">released</a>!</p>
|
||||||
|
<p>For this version Richard Graham has implemented geodetic
|
||||||
|
computation methods, which take into account the curvature of the
|
||||||
|
Earth and the coriolis effect. The computation method is selected
|
||||||
|
by the <em>Geodetic calculations</em> option in the simulation
|
||||||
|
options. It's not <em>(yet)</em> a full spherical computation model, but
|
||||||
|
should be accurate enough for almost all sub-orbital needs.</p>
|
||||||
|
<p>Doug Pedrick has also enhanced the printing system with the
|
||||||
|
ability to print fin positioning guides, transition templates and
|
||||||
|
nose cone profiles. Other smaller enhancements and bug fixes are
|
||||||
|
also included.</p>
|
||||||
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
||||||
<a href="download.html">released</a>!</p>
|
<a href="download.html">released</a>!</p>
|
||||||
<p>This release contains bug fixes to the optimization methods.
|
<p>This release contains bug fixes to the optimization methods.
|
||||||
@ -66,16 +78,6 @@
|
|||||||
easy to optimize against particulars of the simulation methods,
|
easy to optimize against particulars of the simulation methods,
|
||||||
instead of true physical phenomena. Always keep common sense at
|
instead of true physical phenomena. Always keep common sense at
|
||||||
hand and take the results with a grain of salt.</p>
|
hand and take the results with a grain of salt.</p>
|
||||||
<p><span class="date">22.7.2011:</span> Version 1.1.6 is
|
|
||||||
<a href="download.html">released</a>!</p>
|
|
||||||
<p>This release includes initial localization support and
|
|
||||||
translations to French, German and Spanish. This is thanks to the
|
|
||||||
great work of Boris du Reau, and the teams from Tripoli France,
|
|
||||||
Tripoli Spain and ERIG e.V. If you prefer to use some other
|
|
||||||
language than the system default, you can select the language on
|
|
||||||
the "Options" tab of the preferences dialog.</p>
|
|
||||||
<p>The release also includes design scaling support and numerous bug
|
|
||||||
fixes.</p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="contentholder">
|
<div class="contentholder">
|
||||||
<h2>Ready packages</h2>
|
<h2>Ready packages</h2>
|
||||||
@ -94,13 +96,13 @@
|
|||||||
<a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /></a>
|
<a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="downloadbox">
|
<div class="downloadbox">
|
||||||
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.8/OpenRocket-1.1.8.jar/download">
|
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.9/OpenRocket-1.1.9.jar/download">
|
||||||
<strong>Download now!</strong>
|
<strong>Download now!</strong>
|
||||||
<span>OpenRocket-1.1.8.jar</span>
|
<span>OpenRocket-1.1.9.jar</span>
|
||||||
</a>
|
</a>
|
||||||
<span class="alternative">
|
<span class="alternative">
|
||||||
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.8/ReleaseNotes/view">Release notes</a> |
|
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.9/ReleaseNotes/view">Release notes</a> |
|
||||||
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.8/OpenRocket-1.1.8-src.zip/download">Source code</a>
|
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.9/OpenRocket-1.1.9-src.zip/download">Source code</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<h3>Stable release</h3>
|
<h3>Stable release</h3>
|
||||||
@ -117,7 +119,7 @@
|
|||||||
Windows) by double-clicking the package icon. No installation is
|
Windows) by double-clicking the package icon. No installation is
|
||||||
required.</p>
|
required.</p>
|
||||||
<p>From the command line OpenRocket can be started by
|
<p>From the command line OpenRocket can be started by
|
||||||
<span class="command">java -jar OpenRocket-1.1.8.jar</span></p>
|
<span class="command">java -jar OpenRocket-1.1.9.jar</span></p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
|
|||||||
@ -49,12 +49,12 @@
|
|||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
<div class="rightpane">
|
<div class="rightpane">
|
||||||
<div class="downloadbox">
|
<div class="downloadbox">
|
||||||
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.8/OpenRocket-1.1.8.jar/download">
|
<a class="main" href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.9/OpenRocket-1.1.9.jar/download">
|
||||||
<strong>Download now!</strong>
|
<strong>Download now!</strong>
|
||||||
<span>OpenRocket-1.1.8.jar</span>
|
<span>OpenRocket-1.1.9.jar</span>
|
||||||
</a>
|
</a>
|
||||||
<span class="alternative">
|
<span class="alternative">
|
||||||
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.8/ReleaseNotes/view">Release notes</a> |
|
<a href="https://sourceforge.net/projects/openrocket/files/openrocket/1.1.9/ReleaseNotes/view">Release notes</a> |
|
||||||
<a href="download.html">Other versions</a>
|
<a href="download.html">Other versions</a>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -68,7 +68,7 @@
|
|||||||
<a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /> </a>
|
<a href="http://sourceforge.net/donate/index.php?group_id=260357"><img src="project-support.jpg" width="88" height="32" alt="Support This Project" /> </a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p><strong>OpenRocket</strong> is an free, fully featured model
|
<p><strong>OpenRocket</strong> is a free, fully featured model
|
||||||
rocket simulator that allows you to design and simulate your
|
rocket simulator that allows you to design and simulate your
|
||||||
rockets before actually building and flying them.</p>
|
rockets before actually building and flying them.</p>
|
||||||
<p>The main features include:</p>
|
<p>The main features include:</p>
|
||||||
@ -96,6 +96,18 @@
|
|||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
<div class="news">
|
<div class="news">
|
||||||
<h2>News</h2>
|
<h2>News</h2>
|
||||||
|
<p><span class="date">24.11.2011:</span> Version 1.1.9 is
|
||||||
|
<a href="download.html">released</a>!</p>
|
||||||
|
<p>For this version Richard Graham has implemented geodetic
|
||||||
|
computation methods, which take into account the curvature of the
|
||||||
|
Earth and the coriolis effect. The computation method is selected
|
||||||
|
by the <em>Geodetic calculations</em> option in the simulation
|
||||||
|
options. It's not <em>(yet)</em> a full spherical computation model, but
|
||||||
|
should be accurate enough for almost all sub-orbital needs.</p>
|
||||||
|
<p>Doug Pedrick has also enhanced the printing system with the
|
||||||
|
ability to print fin positioning guides, transition templates and
|
||||||
|
nose cone profiles. Other smaller enhancements and bug fixes are
|
||||||
|
also included.</p>
|
||||||
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
||||||
<a href="download.html">released</a>!</p>
|
<a href="download.html">released</a>!</p>
|
||||||
<p>This release contains bug fixes to the optimization methods.
|
<p>This release contains bug fixes to the optimization methods.
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<set stableversion="1.0.0">
|
<set stableversion="1.0.0">
|
||||||
<set developmentversion="1.1.8">
|
<set developmentversion="1.1.9">
|
||||||
<set version="${developmentversion}">
|
<set version="${developmentversion}">
|
||||||
|
|
||||||
<def name="downloadbox">
|
<def name="downloadbox">
|
||||||
|
|||||||
@ -9,6 +9,21 @@
|
|||||||
|
|
||||||
<!--- Remember to move the position of "onlyrecent" below! --->
|
<!--- Remember to move the position of "onlyrecent" below! --->
|
||||||
|
|
||||||
|
<p><span class="date">24.11.2011:</span> Version 1.1.9 is
|
||||||
|
<a href="download.html">released</a>!</p>
|
||||||
|
|
||||||
|
<p>For this version Richard Graham has implemented geodetic
|
||||||
|
computation methods, which take into account the curvature of the
|
||||||
|
Earth and the coriolis effect. The computation method is selected
|
||||||
|
by the <em>Geodetic calculations</em> option in the simulation
|
||||||
|
options. It's not <em>(yet)</em> a full spherical computation model, but
|
||||||
|
should be accurate enough for almost all sub-orbital needs.</p>
|
||||||
|
|
||||||
|
<p>Doug Pedrick has also enhanced the printing system with the
|
||||||
|
ability to print fin positioning guides, transition templates and
|
||||||
|
nose cone profiles. Other smaller enhancements and bug fixes are
|
||||||
|
also included.</p>
|
||||||
|
|
||||||
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
<p><span class="date">25.8.2011:</span> Version 1.1.8 is
|
||||||
<a href="download.html">released</a>!</p>
|
<a href="download.html">released</a>!</p>
|
||||||
|
|
||||||
@ -33,6 +48,10 @@
|
|||||||
instead of true physical phenomena. Always keep common sense at
|
instead of true physical phenomena. Always keep common sense at
|
||||||
hand and take the results with a grain of salt.</p>
|
hand and take the results with a grain of salt.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<if not onlyrecent><!--- Older items not shown on download page: --->
|
||||||
|
|
||||||
|
|
||||||
<p><span class="date">22.7.2011:</span> Version 1.1.6 is
|
<p><span class="date">22.7.2011:</span> Version 1.1.6 is
|
||||||
<a href="download.html">released</a>!</p>
|
<a href="download.html">released</a>!</p>
|
||||||
|
|
||||||
@ -46,10 +65,6 @@
|
|||||||
<p>The release also includes design scaling support and numerous bug
|
<p>The release also includes design scaling support and numerous bug
|
||||||
fixes.</p>
|
fixes.</p>
|
||||||
|
|
||||||
|
|
||||||
<if not onlyrecent><!--- Older items not shown on download page: --->
|
|
||||||
|
|
||||||
|
|
||||||
<p><span class="date">10.6.2011:</span> Version 1.1.5 is
|
<p><span class="date">10.6.2011:</span> Version 1.1.5 is
|
||||||
<a href="download.html">released</a>!</p>
|
<a href="download.html">released</a>!</p>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user