(no commit message)
authorBill Kuker <bkuker@billkuker.com>
Wed, 15 Apr 2009 13:07:26 +0000 (13:07 +0000)
committerBill Kuker <bkuker@billkuker.com>
Wed, 15 Apr 2009 13:07:26 +0000 (13:07 +0000)
src/TriTest.java [new file with mode: 0644]

diff --git a/src/TriTest.java b/src/TriTest.java
new file mode 100644 (file)
index 0000000..03875b7
--- /dev/null
@@ -0,0 +1,135 @@
+import java.awt.BorderLayout;\r
+import java.awt.Color;\r
+import java.awt.Graphics;\r
+import java.awt.Graphics2D;\r
+import java.awt.Shape;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Area;\r
+import java.awt.geom.Ellipse2D;\r
+import java.awt.geom.GeneralPath;\r
+import java.awt.geom.PathIterator;\r
+import java.awt.geom.Rectangle2D;\r
+\r
+import javax.swing.JFrame;\r
+import javax.swing.JPanel;\r
+import javax.swing.JSlider;\r
+import javax.swing.event.ChangeEvent;\r
+import javax.swing.event.ChangeListener;\r
+\r
+\r
+public class TriTest extends JPanel {\r
+       \r
+       double r = 0;\r
+       @Override\r
+       public void paint(Graphics gg){\r
+               Graphics2D g = (Graphics2D)gg;\r
+               \r
+               g.clearRect(0, 0, 600, 600);\r
+               GeneralPath p;\r
+               \r
+               p = new GeneralPath();\r
+               p.moveTo(100,100);\r
+               p.lineTo(200, 150);\r
+               p.lineTo(150, 180);\r
+               p.lineTo(100, 300);\r
+               p.closePath();\r
+               g.setColor(Color.red);\r
+               g.draw(growArea(p, r));\r
+               g.setColor(Color.black);                \r
+               g.draw(p);\r
+               \r
+               \r
+               p = new GeneralPath();\r
+               p.moveTo(10,10);\r
+               p.lineTo(50, 20);\r
+               p.lineTo(60, 30);\r
+               p.closePath();\r
+               g.setColor(Color.red);\r
+               g.draw(growArea(p, 10));\r
+               g.setColor(Color.black);                \r
+               g.draw(p);\r
+               \r
+       }\r
+       \r
+       private Area growArea( Shape a, double sz ){\r
+               Area ret = new Area();\r
+               \r
+               PathIterator i = a.getPathIterator(new AffineTransform(), .001);\r
+               double last[] = {0,0};\r
+               double first[] = {0,0};\r
+               while (!i.isDone()) {\r
+                       double coords[] = new double[6];\r
+                       int type = i.currentSegment(coords);\r
+                       switch (type){\r
+                               case PathIterator.SEG_MOVETO:\r
+                                       first[0] = last[0] = coords[0];\r
+                                       first[1] = last[1] = coords[1];\r
+                                       break;\r
+                               case PathIterator.SEG_CLOSE:\r
+                                       coords[0] = first[0];\r
+                                       coords[1] = first[1];\r
+                               case PathIterator.SEG_LINETO:\r
+                                       //Do it;\r
+                                       double len = Math.sqrt(Math.pow(last[0] - coords[0], 2) + Math.pow(last[1] - coords[1], 2));\r
+                                       double dx = coords[0]-last[0];\r
+                                       double dy = coords[1]-last[1];\r
+                                       double angle = Math.atan2(dy, dx);\r
+                                                       \r
+                                       Area rect;\r
+                                       if ( sz > 0 )\r
+                                               rect = new Area(new Rectangle2D.Double(0,-sz,len,sz));\r
+                                       else\r
+                                               rect = new Area(new Rectangle2D.Double(0,0,len,-sz));\r
+                                       rect.transform(AffineTransform.getRotateInstance(angle));\r
+                                       rect.transform(AffineTransform.getTranslateInstance(last[0], last[1]));\r
+                                       ret.add(rect);\r
+                                       \r
+                                       if ( sz > 0 ){\r
+                                               ret.add(new Area(new Ellipse2D.Double(coords[0]-sz, coords[1]-sz, sz*2, sz*2)));\r
+                                       } else {\r
+                                               ret.add(new Area(new Ellipse2D.Double(coords[0]+sz, coords[1]+sz, -sz*2, -sz*2)));\r
+                                       }\r
+                                       \r
+                                       \r
+                                       last[0] = coords[0];\r
+                                       last[1] = coords[1];\r
+                                       break;\r
+                               case PathIterator.SEG_CUBICTO:\r
+                               case PathIterator.SEG_QUADTO:\r
+                                       throw new Error("Unflattend Geometry!");\r
+                       }\r
+                       i.next();\r
+               }\r
+               \r
+               if ( sz > 0 )\r
+                       ret.add(new Area(a));\r
+               else\r
+                       ret.intersect(new Area(a));\r
+               return ret;\r
+       }\r
+       \r
+       public static void main( String args[] ){\r
+               JFrame f = new JFrame();\r
+               f.setDefaultCloseOperation(f.DISPOSE_ON_CLOSE);\r
+               final TriTest t = new TriTest();\r
+               f.getContentPane().setLayout(new BorderLayout());\r
+               f.getContentPane().add(t, BorderLayout.CENTER);\r
+               f.getContentPane().add(new JSlider(){{\r
+                               setMinimum(-100);\r
+                               setMaximum(100);\r
+                               addChangeListener(new ChangeListener(){\r
+                                       { setValue(0); }\r
+                                       @Override\r
+                                       public void stateChanged(ChangeEvent arg0) {\r
+                                               t.r = getValue();\r
+                                               t.repaint();\r
+                                       }\r
+                               });\r
+                       }}, BorderLayout.SOUTH);\r
+\r
+               f.setSize(400,400);\r
+               f.setLocation(600,600);\r
+               f.show();\r
+               \r
+       }\r
+}\r