package com.billkuker.rocketry.motorsim.grain;\r
\r
import java.awt.BorderLayout;\r
+import java.awt.Color;\r
import java.awt.Dimension;\r
import java.awt.Graphics;\r
import java.awt.Graphics2D;\r
+import java.awt.Rectangle;\r
+import java.awt.geom.AffineTransform;\r
import java.text.NumberFormat;\r
\r
import javax.measure.quantity.Area;\r
charts.setDividerLocation(.5);\r
charts.setResizeWeight(.5);\r
\r
- if ( grain instanceof Grain.Graphical)\r
- add(xc = new XC((Grain.Graphical)grain), BorderLayout.CENTER);\r
- \r
JPanel left = new JPanel(new BorderLayout());\r
- left.add(xc);\r
+ \r
+ if ( grain instanceof Grain.Graphical){\r
+ add(xc = new XC((Grain.Graphical)grain), BorderLayout.CENTER);\r
+ left.add(xc);\r
+ }\r
left.add(l, BorderLayout.NORTH);\r
- left.add( new SL(), BorderLayout.SOUTH);\r
+ left.add( sl = new SL(), BorderLayout.SOUTH);\r
\r
add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, charts));\r
\r
}\r
\r
+ public void setDisplayedRegression( Amount<Length> r ){\r
+ displayedRegression = r;\r
+ \r
+ NumberFormat nf = NumberFormat.getInstance();\r
+ nf.setMaximumFractionDigits(2);\r
+ l.setText("Regression: " + nf.format(displayedRegression.doubleValue(SI.MILLIMETER)) + "mm");\r
+ \r
+ area.mark(displayedRegression);\r
+ volume.mark(displayedRegression);\r
+ if ( xc != null )\r
+ xc.repaint();\r
+ }\r
+ \r
private class XC extends JPanel{\r
private static final long serialVersionUID = 1L;\r
Grain.Graphical grain;\r
public XC(Grain.Graphical g){\r
- setMinimumSize(new Dimension(220,220));\r
+ setMinimumSize(new Dimension(440,250));\r
grain = g;\r
}\r
public void paint(Graphics g){\r
super.paint(g);\r
Graphics2D g2d = (Graphics2D)g;\r
g2d.translate(10, 30);\r
+ /*\r
grain.draw(g2d, displayedRegression );\r
+ */\r
+ \r
+ {\r
+ AffineTransform t = g2d.getTransform();\r
+ java.awt.geom.Area unburnt = grain.getCrossSection(Amount.valueOf(0, SI.MILLIMETER));\r
+ \r
+ Rectangle bounds = unburnt.getBounds();\r
+ g2d.scale(200 / bounds.getWidth(), 200 / bounds.getHeight());\r
+ g2d.translate(-bounds.getX(), -bounds.getY());\r
+ \r
+ //Draw the fuel that is left\r
+ java.awt.geom.Area burning = grain.getCrossSection(displayedRegression);\r
+ g2d.setColor(Color.RED);\r
+ g2d.fill(burning);\r
+ //Draw the fuel that is left\r
+ java.awt.geom.Area left = grain.getCrossSection(displayedRegression.plus(grain.webThickness().divide(30)));\r
+ g2d.setColor(Color.GRAY);\r
+ g2d.fill(left);\r
+ //Draw the outline of the unburnt grain\r
+ g2d.setColor(Color.BLACK);\r
+ g2d.draw(unburnt);\r
+ //untranslate\r
+ g2d.setTransform(t);\r
+ }\r
+ {\r
+ AffineTransform t = g2d.getTransform();\r
+ java.awt.geom.Area unburnt = grain.getSideView(Amount.valueOf(0, SI.MILLIMETER));\r
+ \r
+ Rectangle bounds = unburnt.getBounds();\r
+ g2d.translate(220, 0);\r
+ \r
+ double max = bounds.getWidth();\r
+ if ( bounds.getHeight() > max )\r
+ max = bounds.getHeight();\r
+ \r
+ g2d.scale(200 / max, 200 / max);\r
+ g2d.translate(-bounds.getX(), -bounds.getY());\r
+ \r
+ //Draw the fuel that is left\r
+ java.awt.geom.Area burning = grain.getSideView(displayedRegression);\r
+ g2d.setColor(Color.RED);\r
+ g2d.fill(burning);\r
+ //Draw the fuel that is left\r
+ java.awt.geom.Area left = grain.getSideView(displayedRegression.plus(grain.webThickness().divide(30)));\r
+ g2d.setColor(Color.GRAY);\r
+ g2d.fill(left);\r
+ //Draw the outline of the unburnt grain\r
+ g2d.setColor(Color.BLACK);\r
+ g2d.draw(unburnt);\r
+ //untranslate\r
+ g2d.setTransform(t);\r
+ }\r
+ \r
}\r
}\r
\r
@Override\r
public void stateChanged(ChangeEvent e) {\r
double r = ((SL)e.getSource()).getValue();\r
- displayedRegression = grain.webThickness().divide(STEPS).times(r);\r
- NumberFormat nf = NumberFormat.getInstance();\r
- nf.setMaximumFractionDigits(2);\r
- l.setText("Regression: " + nf.format(displayedRegression.doubleValue(SI.MILLIMETER)) + "mm");\r
- area.mark(displayedRegression);\r
- volume.mark(displayedRegression);\r
- if ( xc != null )\r
- xc.repaint();\r
+\r
+ setDisplayedRegression(grain.webThickness().divide(STEPS).times(r));\r
}\r
}\r
\r