New panels.
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / GrainPanel.java
index 6f2b7d627b21a8e0bcb2070397082d867543fa50..e684236ee76455c2320531e09dc4325d05f3097d 100644 (file)
@@ -1,9 +1,12 @@
 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
@@ -71,30 +74,98 @@ public class GrainPanel extends JPanel {
                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
@@ -111,14 +182,8 @@ public class GrainPanel extends JPanel {
                @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