import java.applet.*; import java.util.StringTokenizer; import java.awt.*; public class graf extends java.applet.Applet { boolean invdata = false; int ny = 0; float y[]; float z[]; float maxy = 0; float yinc = 1; int starttime = -1; int intsize = -1; String label; public void init() { int i; int pnum; String parm; StringTokenizer st; setBackground(Color.white); for (pnum = 1; ; pnum++) { parm = getParameter("y." + pnum); if (parm == null) break; st = new StringTokenizer(parm, " "); ny += st.countTokens(); } y = new float[ny]; label = getParameter("label"); String temp; temp = getParameter("starttime"); if (temp != null) { String hh = temp.substring(0, 2); String mm = temp.substring(3, 5); String ss = temp.substring(6, 8); starttime = 3600 * Integer.valueOf(hh).intValue() + 60 * Integer.valueOf(mm).intValue() + Integer.valueOf(ss).intValue(); } temp = getParameter("intsize"); if (temp != null) intsize = Integer.valueOf(temp).intValue(); i = 0; for (pnum = 1; ; pnum++) { parm = getParameter("y." + pnum); if (parm == null) break; st = new StringTokenizer(parm, " "); while (st.hasMoreElements()) { temp = st.nextToken(); y[i] = Float.valueOf(temp).floatValue(); if (y[i] > maxy) maxy = y[i]; i++; } } if (maxy < 5) { while ((yinc * 50) >= maxy) yinc /= 10; yinc *= 10; } else { while ((yinc * 50) < maxy) yinc *= 10; } } public void paint(Graphics g) { int i; float yval; int xprev; int yprev; int xcurr; int ycurr; int hh; int mm; String temp; FontMetrics fm = g.getFontMetrics(); Dimension dim = size(); int ytop = 10; if (label != null) ytop = ytop + fm.getHeight() + 4; int ybot = dim.height - fm.getHeight() - 10; int numticp = (ybot - ytop) / 30; if (numticp < 1) numticp = 1; int numtic = (int) ((maxy + yinc) / yinc); while (numtic > numticp) { yinc *= 2; numtic = (int) ((maxy + yinc) / yinc); if (numtic <= numticp) break; yinc *= 2.5; numtic = (int) ((maxy + yinc) / yinc); if (numtic <= numticp) break; yinc *= 2; numtic = (int) ((maxy + yinc) / yinc); } if (((numtic - 1) * yinc) == maxy) numtic -= 1; if (numtic > 20) numtic = 20; if (numtic < 1) numtic = 1; maxy = numtic * yinc; int maxwidth = 0; for (i = 1; i <= numtic; i++) { yval = yinc * i; if (maxwidth < fm.stringWidth("" + yval)) maxwidth = fm.stringWidth("" + yval); } int xleft = 10 + maxwidth + 3; int xright = dim.width - 10; int yrange = ybot - ytop; int xrange = xright - xleft; if (label != null) { xcurr = xleft + ( (xrange - fm.stringWidth(label)) / 2 ); ycurr = ytop - 4 - fm.getDescent(); g.drawString(label, xcurr, ycurr); } g.setColor(Color.black); g.drawLine(xleft, ytop, xleft, ybot); g.drawLine(xleft, ybot, xright, ybot); g.drawLine(xright, ytop, xright, ybot); int drop = (fm.getAscent() - fm.getDescent()) / 2; for (i = 1; i <= numtic; i++) { yval = yinc * i; ycurr = ytop + (int) ( (yrange * (maxy - yval)) / maxy); g.drawLine(xleft, ycurr, xright, ycurr); ycurr = ycurr + drop; xcurr = 5 + maxwidth - fm.stringWidth("" + yval); g.drawString("" + yval, xcurr, ycurr); } if (starttime != -1 && intsize != -1) { g.setColor(Color.blue); int maxt = xrange / (2 * fm.stringWidth("99:99")); int tmark = 1440; int trange = (ny - 1) * intsize / 60; if ((trange / 720) <= maxt) tmark = 720; if ((trange / 480) <= maxt) tmark = 480; if ((trange / 240) <= maxt) tmark = 240; if ((trange / 120) <= maxt) tmark = 120; if ((trange / 60) <= maxt) tmark = 60; if ((trange / 15) <= maxt) tmark = 15; if ((trange / 5) <= maxt) tmark = 5; if ((trange / 1) <= maxt) tmark = 1; int ctime = 60 * tmark * (starttime / (60 * tmark)); ycurr = ybot + fm.getHeight(); for (;;) { ctime = ctime + (60 * tmark); xcurr = xleft + xrange * (ctime - starttime) / (trange * 60); if (xcurr >= xright) break; g.drawLine(xcurr, ytop, xcurr, ybot); hh = ctime / 3600; mm = (ctime - (hh * 3600)) / 60; hh %= 24; if (mm < 10) temp = "" + hh + ":0" + mm; else temp = "" + hh + ":" + mm; xcurr = xcurr - (fm.stringWidth(temp) / 2); g.drawString(temp, xcurr, ycurr); } } g.setColor(Color.red); xprev = xleft; if (y[0] < 0) yprev = -1; else { yprev = ytop + (int) ( (yrange * (maxy - y[0])) / maxy); g.fillOval(xprev - 2, yprev - 2, 5, 5); } for (i = 1; i < ny; i++) { xcurr = xleft + (xrange * i) / (ny - 1); if (y[i] < 0) ycurr = -1; else ycurr = ytop + (int) ( (yrange * (maxy - y[i])) / maxy); if (yprev >= 0 && ycurr >= 0) g.drawLine(xprev, yprev, xcurr, ycurr); if (ycurr >= 0 && yprev < 0) g.fillOval(xcurr - 2, ycurr - 2, 5, 5); if (ycurr < 0 && yprev >= 0) g.fillOval(xprev - 2, yprev - 2, 5, 5); xprev = xcurr; yprev = ycurr; } if (yprev >= 0) g.fillOval(xprev - 2, yprev - 2, 5, 5); } }