]> git.gag.com Git - sw/motorsim/commitdiff
Added web thickness calculation
authorBill Kuker <bkuker@billkuker.com>
Wed, 15 Apr 2009 19:38:11 +0000 (19:38 +0000)
committerBill Kuker <bkuker@billkuker.com>
Wed, 15 Apr 2009 19:38:11 +0000 (19:38 +0000)
src/com/billkuker/rocketry/motorsim/grain/RotatedShapeGrain.java

index 468b806e478fdd9acd42f49b6e5371bb84969917..45187f6e12d1e14986e4d10b33dab675800c38e5 100644 (file)
@@ -1,5 +1,6 @@
 package com.billkuker.rocketry.motorsim.grain;\r
 \r
+import java.awt.Rectangle;\r
 import java.awt.Shape;\r
 import java.awt.geom.AffineTransform;\r
 import java.awt.geom.Area;\r
@@ -7,11 +8,11 @@ import java.awt.geom.Ellipse2D;
 import java.awt.geom.GeneralPath;\r
 import java.awt.geom.PathIterator;\r
 import java.awt.geom.Rectangle2D;\r
-\r
 import javax.measure.quantity.Length;\r
 import javax.measure.quantity.Volume;\r
 import javax.measure.unit.SI;\r
 \r
+import org.apache.log4j.Logger;\r
 import org.jscience.physics.amount.Amount;\r
 \r
 import com.billkuker.rocketry.motorsim.Grain;\r
@@ -20,6 +21,8 @@ import com.billkuker.rocketry.motorsim.visual.GrainPanel;
 \r
 public class RotatedShapeGrain implements Grain {\r
        \r
+       private static Logger log = Logger.getLogger(RotatedShapeGrain.class);\r
+       \r
        public enum Quality {\r
                High()\r
                        {{\r
@@ -95,8 +98,6 @@ public class RotatedShapeGrain implements Grain {
                \r
                burn.subtract(shape.getShape(regression.plus(Amount.valueOf(quality.surfaceAreaStep,\r
                                SI.MILLIMETER))));\r
-               \r
-               System.out.println(regression);\r
        \r
                double sqmm = yRotatedSurfaceArea(burn);\r
 \r
@@ -117,13 +118,34 @@ public class RotatedShapeGrain implements Grain {
        }\r
 \r
        @Override\r
-       //TODO find actual thickness\r
        public Amount<Length> webThickness() {\r
-               if ( web != null )\r
+               if (web != null)\r
                        return web;\r
-               Rectangle2D b = shape.getShape(Amount.valueOf(0, SI.MILLIMETER)).getBounds2D();\r
-               double webmm = b.getWidth()>b.getHeight()?b.getWidth():b.getHeight();\r
-               return web = Amount.valueOf(webmm, SI.MILLIMETER);\r
+\r
+               java.awt.geom.Area a = getCrossSection(Amount.valueOf(0, SI.MILLIMETER));\r
+               Rectangle r = a.getBounds();\r
+               double max = r.getWidth() < r.getHeight() ? r.getHeight() : r\r
+                               .getWidth(); // The max size\r
+               double min = 0;\r
+               double guess;\r
+               while (true) {\r
+                       guess = min + (max - min) / 2; // Guess halfway through\r
+                       log.debug("Min: " + min + " Guess: " + guess + " Max: " + max);\r
+                       a = getCrossSection(Amount.valueOf(guess, SI.MILLIMETER));\r
+                       if (a.isEmpty()) {\r
+                               // guess is too big\r
+                               max = guess;\r
+                       } else {\r
+                               // min is too big\r
+                               min = guess;\r
+                       }\r
+                       if ((max - min) < .01)\r
+                               break;\r
+               }\r
+               web = Amount.valueOf(guess, SI.MILLIMETER);\r
+\r
+               return web;\r
+\r
        }\r
        \r
 \r
@@ -212,8 +234,6 @@ public class RotatedShapeGrain implements Grain {
                                        add = Math.PI * (xl*s1 - xs*s2);\r
                                }\r
                                \r
-                               System.out.println(add);\r
-                               \r
                                len += add;\r
 \r
                                x = nx;\r