package graph; import java.awt.*; import java.util.*; import java.lang.*; import java.io.StreamTokenizer; import java.io.InputStream; import java.io.IOException; import java.net.URL; /* ************************************************************************** ** ** Class graph.Marker ** ************************************************************************** ** Copyright (C) 1996 Leigh Brookshaw ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************** ** ** class Marker extends Object ** This class is designed to help install and manipulate ** markers ** *************************************************************************/ /** * This class installs, manipulates and draws markers. * Markers are stroked using the line drawing method of the class Graph. * This means that any stroked figure can become a marker. * * @version $Revision: 1.8 $, $Date: 1996/09/20 00:02:57 $ * @author Leigh Brookshaw */ public class Markers extends Object { /* ********************** ** ** Protected Variables ** *********************/ /** * index of the last marker loaded */ protected int last; /** * maximum number of markers allowed */ protected int max = 10; /** * An array of vectors. Each element in the array contains the vertex * vectors for a marker. Marker 1 is at element vert[0]. */ protected Vector vert[]; /* ******************* ** ** Constructors ** ******************/ /** * The class contructor */ public Markers() { last = 0; vert = new Vector[max]; } /** * Instantiate the Marker class and load marker definitions from the parsed URL. * The format of the file is easily worked out from the * default marker file marker.txt. * * @param file The URL of the data file to read * @exception IOException if there is an error with the IO stream. */ public Markers(URL file) throws IOException { this(); LoadMarkers(file); } /** * Add the definition of a new marker. The arrays contain the vertex * points of the marker. The boolean array is used to define a relative draw * or move to the vertex. * The first vertex should always be a move (The boolean array is "true" * for a relative draw. * * @param m The index of the marker. The first marker has index 1. * @param n The number of vertices required to stroke the marker. * @param draw Boolean array containing relative move/draw instructions. * "true" is a draw. * @param x Integer array containing the pixel x position of the vertices. * All positions are relative to the center of the marker. * @param y Integer array containing the pixel y postions of the vertices. */ public void AddMarker( int m, int n, boolean draw[], int x[], int y[]) { MarkerVertex v; int i; if(m < 1 || m > max ) return; if( n <= 0 ) return; m--; last = m; vert[m] = new Vector(); for(i=0; itrue if the point is to drawn to, false if * the point is to be moved to. * @param x X pixel to move/draw to. * @param x Y pixel to move/draw to. */ public void AddMarker(int n, boolean draw[], int x[], int y[]) { AddMarker(last+1,n,draw,x,y); } /** * Delete the marker with the given index. the first marker has index 1. * @param n The index of the marker to delete. Markers start at index 1. */ public void DeleteMarker( int n ) { if(n<1 || n>max) return; vert[n-1] = null; } /** * Clear All markers. */ public void ClearMarkers() { int i; if(last == 0) return; for(i=0; i *
start *
starts a new marker definition. *
end *
ends a marker definition. *
m x y *
move to position x,y *
l x y *
line to position x,y * * All line drawing is relative to the previous position. The center * of the marker is assumed to be at (0,0). * As always blank lines are ignored and comments begin with a # character. * * @param file URL of file to load * @exception IOException If there is an IO error */ public void LoadMarkers(URL file) throws IOException { InputStream is; StreamTokenizer st; MarkerVertex v; is = file.openStream(); st = new StreamTokenizer(is); st.eolIsSignificant(true); st.commentChar('#'); scan: while (true) { switch (st.nextToken()) { default: break scan; case StreamTokenizer.TT_EOL: break; case StreamTokenizer.TT_WORD: if ("start".equals(st.sval)) { vert[last] = new Vector(); } else if ("end".equals(st.sval)) { last++; } else if ("m".equals(st.sval)) { v = new MarkerVertex(); v.draw = false; if (st.nextToken() == StreamTokenizer.TT_NUMBER) { v.x = (int)st.nval; if (st.nextToken() == StreamTokenizer.TT_NUMBER) { v.y = (int)st.nval; vert[last].addElement(v); } } } else if ("l".equals(st.sval)) { v = new MarkerVertex(); v.draw = true; if (st.nextToken() == StreamTokenizer.TT_NUMBER) { v.x = (int)st.nval; if (st.nextToken() == StreamTokenizer.TT_NUMBER) { v.y = (int)st.nval; vert[last].addElement(v); } } } break; } } is.close(); } /** * draw the marker * @param g Graphics context * @param m Index of the marker to draw * @param scale scale factor. All coordinates are multiplied by this factor. * @param x Coordinate where to draw the marker * @param y Coordinate where to draw the marker */ public void draw(Graphics g, int m, double scale, int x, int y) { int i; MarkerVertex mv; int x0 = x, x1 = x, y0 = y, y1 = y; Vector v; if(m < 1 || m > max ) return; if(scale <= 0) return; v = vert[m-1]; if( v == null) return; for (i=0; i