package com.billkuker.rocketry.motorsim.visual;\r
\r
import java.awt.BorderLayout;\r
+import java.awt.Color;\r
import java.awt.Dimension;\r
import java.awt.GridLayout;\r
import java.text.NumberFormat;\r
SI.MEGA(SI.PASCAL),\r
b,\r
"pressure");\r
- pressure.showAverage();\r
- pressure.showMax();\r
pressure.setDomain(burn.getData().keySet());\r
\r
thrust = new Chart<Duration, Force>(\r
SI.NEWTON,\r
b,\r
"thrust");\r
- thrust.showAverage();\r
- thrust.showMax();\r
thrust.setDomain(burn.getData().keySet());\r
\r
burnRate = new Chart<Pressure, Velocity>(\r
.ammountToRoundedString(bi.maxPressure())));\r
\r
add(text, BorderLayout.NORTH);\r
+ \r
+ thrust.addRangeMarker(bi.maxThrust(), "Max", Color.BLACK);\r
+ thrust.addRangeMarker(bi.averageThrust(), "Average", Color.BLACK);\r
+ pressure.addRangeMarker(bi.maxPressure(), "Max", Color.BLACK);\r
+ burnRate.addDomainMarker(bi.maxPressure(), "Max", Color.RED);\r
}\r
\r
\r
private static final long serialVersionUID = 1L;\r
private static Logger log = Logger.getLogger(Chart.class);\r
\r
- private final Stroke dashed =new BasicStroke(1, 1, 1, 1, new float[]{2,4}, 0);\r
+ private final Stroke dashed = new BasicStroke(1, 1, 1, 1, new float[]{2,4}, 0);\r
+ private final Font labelFont = new Font(Font.DIALOG, Font.BOLD, 10);\r
\r
private static ThreadFactory tf = new ThreadFactory() {\r
public Thread newThread(Runnable r) {\r
);\r
add(new ChartPanel(chart));\r
}\r
-\r
- public void showMax(){\r
- markMax = true;\r
+ \r
+ public void addDomainMarker(Amount<X> x, String label, Color c){\r
+ double xVal = x.doubleValue(xUnit);\r
+ Marker marker = new ValueMarker(xVal);\r
+ marker.setStroke(dashed);\r
+ marker.setPaint(c);\r
+ marker.setLabelPaint(c);\r
+ marker.setLabelFont(labelFont);\r
+ marker.setLabel(label + ": " + RocketScience.ammountToRoundedString(x));\r
+ marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);\r
+ marker.setLabelOffset(new RectangleInsets(0, -5, 0, 0));\r
+ chart.getXYPlot().addDomainMarker(marker);\r
}\r
\r
- public void showAverage(){\r
- markAverage = true;\r
+ public void addRangeMarker(Amount<Y> y, String label, Color c){\r
+ double yVal = y.doubleValue(yUnit);\r
+ Marker marker = new ValueMarker(yVal);\r
+ marker.setStroke(dashed);\r
+ marker.setPaint(Color.BLACK);\r
+ marker.setLabelFont(labelFont);\r
+ marker.setLabel("Max: "\r
+ + RocketScience.ammountToRoundedString(Amount.valueOf(yVal,\r
+ yUnit)));\r
+ marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);\r
+ marker.setLabelOffset(new RectangleInsets(0, 5, 0, 0));\r
+ chart.getXYPlot().addRangeMarker(marker);\r
}\r
- private boolean markMax = false, markAverage = false;\r
- private Marker focusMarkerX, focusMarkerY;\r
- private void markMax(){\r
- if ( !markMax && !markAverage )\r
- return;\r
- if ( dataset.getSeriesCount() != 1 ){\r
- return;\r
- }\r
- final XYSeries s = dataset.getSeries(0);\r
-\r
- double max = 0;\r
- double accum = 0;\r
- for ( int i = 0; i < s.getItemCount(); i++){\r
- if ( s.getY(i).doubleValue() > max ){\r
- max = s.getY(i).doubleValue();\r
- }\r
- if ( i > 0 ){\r
- double dx = s.getX(i).doubleValue() - s.getX(i-1).doubleValue();\r
- accum += s.getY(i).doubleValue() * dx;\r
- }\r
- }\r
- double average = accum / (s.getX(s.getItemCount()-1).doubleValue() - s.getX(0).doubleValue());\r
- \r
- if (markMax) {\r
- Marker marker = new ValueMarker(average);\r
- marker.setStroke(dashed);\r
- marker.setPaint(Color.BLACK);\r
- marker.setLabelFont(new Font(Font.DIALOG, Font.BOLD, 10));\r
- marker.setLabel("Average: "\r
- + RocketScience.ammountToRoundedString(Amount.valueOf(\r
- average, yUnit)));\r
- marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);\r
- marker.setLabelOffset(new RectangleInsets(0, 5, 0, 0));\r
- chart.getXYPlot().addRangeMarker(marker);\r
- }\r
-\r
- if (markAverage) {\r
- Marker marker = new ValueMarker(max);\r
- marker.setStroke(dashed);\r
- marker.setPaint(Color.BLACK);\r
- marker.setLabelFont(new Font(Font.DIALOG, Font.BOLD, 10));\r
- marker.setLabel("Max: "\r
- + RocketScience.ammountToRoundedString(Amount.valueOf(max,\r
- yUnit)));\r
- marker.setLabelTextAnchor(TextAnchor.TOP_LEFT);\r
- marker.setLabelOffset(new RectangleInsets(0, 5, 0, 0));\r
- chart.getXYPlot().addRangeMarker(marker);\r
- }\r
\r
- }\r
+ private Marker focusMarkerX, focusMarkerY;\r
\r
public void mark(Amount<X> m) {\r
if (focusMarkerX != null)\r
focusMarkerY.setLabelAnchor(RectangleAnchor.TOP_RIGHT);\r
focusMarkerY.setLabelTextAnchor(TextAnchor.TOP_RIGHT);\r
focusMarkerY.setLabelPaint(Color.BLUE);\r
- focusMarkerY.setLabelFont(new Font(Font.DIALOG, Font.BOLD, 10));\r
+ focusMarkerY.setLabelFont(labelFont);\r
focusMarkerY.setLabelOffset(new RectangleInsets(0,5,0,0));\r
chart.getXYPlot().addRangeMarker(focusMarkerY);\r
focusMarkerY.setLabel(RocketScience.ammountToRoundedString(val));\r
}\r
\r
private void drawDone(){\r
- markMax();\r
+ \r
}\r
\r
private volatile boolean stop = false;\r