--- /dev/null
+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