001 package cs101.awt.geom; 002 003 import java.awt.Shape; 004 005 import java.awt.geom.Point2D; 006 import java.awt.geom.PathIterator; 007 008 /** 009 * This class provides a simple interface for listing all the knot 010 * points in an <code>java.awt.Shape</code>. 011 * 012 * @author Patrick G. Heck gus.heck@olin.edu 013 * @version $Id: PointIterator.java,v 1.7 2003/03/06 21:58:16 gus Exp $ 014 */ 015 public class PointIterator { 016 017 // GeneralPath ourPath; 018 PathIterator iter; 019 Point2D.Float pathStart; 020 float[] data = new float[6]; 021 022 /** 023 * Creates a <code>PointIterator</code> for the specified <code>Shape</code>. 024 * 025 * @param s the <code>Shape</code> to iterate over. 026 */ 027 public PointIterator(Shape s) { 028 iter = s.getPathIterator(null); 029 } 030 031 /** 032 * Test to see if the entire shape has been processed. 033 * 034 * @return <code>true</code> if all points in the shape have been returned. 035 * <code>false</code> otherwise. 036 */ 037 038 public boolean hasNext() { 039 return !iter.isDone(); 040 } 041 042 /** 043 * Test to see if the supplied point is the same object as the current 044 * start point for the current path. If this test fails after it has 045 * succeeded then the itterator can be assumed to have begun a new portion 046 * of a discontinuous <code>GeneralPath</code>, or similar shape. 047 * 048 * @param pt The point to test 049 */ 050 051 public boolean isStart(Point2D.Float pt) { 052 return pt == pathStart; 053 } 054 055 /** 056 * Return the next point in the shape. When a path in the shape is closed, 057 * The object returned is the same object that was returned for the last 058 * moveTo such that (return value of moveTo) == (return value of close). 059 * Note that this is only useful for simple shapes that contain only one 060 * path. There is no means provided in <code>PathIterator</code> to 061 * distinguish points returned from a moveTo segments beyond the 062 * first segment (which is guaranteed by Sun to be a moveTo). 063 * 064 * @return The next point in the shape. 065 */ 066 public Point2D.Float nextPoint() { 067 int segType = iter.currentSegment(data); 068 iter.next(); 069 switch (segType) { 070 case PathIterator.SEG_MOVETO: 071 pathStart = new Point2D.Float(data[0],data[1]); 072 return pathStart; 073 074 case PathIterator.SEG_CLOSE: 075 return pathStart; 076 077 case PathIterator.SEG_LINETO: 078 return new Point2D.Float(data[0],data[1]); 079 080 case PathIterator.SEG_QUADTO: 081 return new Point2D.Float(data[2],data[3]); 082 083 case PathIterator.SEG_CUBICTO: 084 return new Point2D.Float(data[4],data[5]); 085 086 default: 087 throw new Error("This only hapens if Sun changes PathIterator"); 088 089 } 090 091 } 092 } 093 /* 094 * $Log: PointIterator.java,v $ 095 * Revision 1.7 2003/03/06 21:58:16 gus 096 * even better doc 097 * 098 * Revision 1.6 2003/03/06 21:56:54 gus 099 * better doc 100 * 101 * Revision 1.5 2003/03/06 21:54:02 gus 102 * add a method to test for equivalance with the start of the current path. 103 * 104 * Revision 1.4 2003/03/06 18:55:56 gus 105 * we need to advance the pathIterator despite what the nutshell book claims 106 * 107 * Revision 1.3 2003/03/04 16:04:45 gus 108 * Javadoc improvements 109 * 110 * Revision 1.2 2003/03/04 15:32:20 gus 111 * adding log comment 112 * 113 */