import java.awt.*; import java.awt.image.*; public class plot extends Canvas { int h[] = null; int v[] = null; int zv = -1; int nint = 0; integrator int_trap = null; integrator int_simp = null; integrator int_left = null; integrator int_mid = null; integrator int_right = null; int shade = 0; Rectangle r = null; double xmin = 0, xmax = 10, ymin = -1, ymax = 1; Image buf = null; public plot() { super(); setBackground(Color.white); } public void paint(Graphics g2) { set_rect(); //int hh = size().height; //int ww = size().width; if (buf == null) buf = createImage(size().width, size().height); Graphics g = buf.getGraphics(); g.setColor(Color.white); g.fillRect(0, 0, size().width, size().height); g.setColor(Color.blue); g.drawLine(r.x, r.y, r.x - 5, r.y); g.drawLine(r.x, r.y + r.height, r.x - 5, r.y + r.height); String s = format_num(ymax); g.drawString(s, r.x - 7 - g.getFontMetrics().stringWidth(s), r.y + 4); s = format_num(ymin); g.drawString(s, r.x - 7 - g.getFontMetrics().stringWidth(s), r.y + r.height + 4); g.drawLine(r.x, r.y + r.height, r.x, r.y + r.height + 5); g.drawLine(r.x + r.width, r.y + r.height, r.x + r.width, r.y + r.height + 5); s = format_num(xmin); g.drawString(s, r.x - g.getFontMetrics().stringWidth(s) / 2, r.y + r.height + 17); s = format_num(xmax); g.drawString(s, r.x + r.width - g.getFontMetrics().stringWidth(s) / 2, r.y + r.height + 17); if (zv >= r.y && zv <= r.y + r.height) { g.drawLine(r.x, zv, r.x + r.width, zv); if (zv >= r.y + 10 && zv <= r.y + r.height - 10) { g.drawLine(r.x - 5, zv, r.x, zv); s = format_num(0); g.drawString(s, r.x - 7 - g.getFontMetrics().stringWidth(s), zv + 4); } } if (h != null && v != null) { g.setColor(Color.orange); //g.setColor(new Color(255, 178, 35)); int ppi = (h.length - 1) / nint; int zv2 = zv; if (zv2 < r.y) zv2 = r.y; else if (zv2 > r.y + r.height) zv2 = r.y + r.height; int x[] = new int[4]; int y[] = new int[4]; for (int i = 0; i < nint + 1; i ++) { int j = i * ppi; //g.drawLine(h[j], zv2, h[j], v[j]); if (i >= nint) continue; switch (shade) { case 0: { int j2 = (i + 1) * ppi; x[0] = h[j]; y[0] = zv2; x[1] = h[j2]; y[1] = zv2; x[2] = h[j2]; y[2] = v[j2]; x[3] = h[j]; y[3] = v[j]; g.fillPolygon(x, y, 4); } break; case 1: { if (nint % 2 == 0 && i % 2 == 0) { int j2 = (i + 1) * ppi; int j3 = (i + 2) * ppi; for (int k = 0; k < 2 * ppi; k ++) { int j4 = j + k; int j5 = j4 + 1; x[0] = h[j4]; y[0] = zv2; x[1] = h[j5]; y[1] = zv2; x[2] = h[j5]; x[3] = h[j4]; if (h[j] != h[j2] && h[j] != h[j3] && h[j2] != h[j3]) { y[2] = (int) lagrange(h[j5], h[j], v[j], h[j2], v[j2], h[j3], v[j3]); y[3] = (int) lagrange(h[j4], h[j], v[j], h[j2], v[j2], h[j3], v[j3]); } else { y[2] = v[j5]; y[3] = v[j4]; } g.fillPolygon(x, y, 4); } } } break; case 2: { int j2 = (i + 1) * ppi; x[0] = h[j]; y[0] = zv2; x[1] = h[j2]; y[1] = zv2; x[2] = h[j2]; y[2] = v[j]; x[3] = h[j]; y[3] = v[j]; g.fillPolygon(x, y, 4); } break; case 3: { int j2 = (i + 1) * ppi; int j3 = i * ppi + ppi / 2; x[0] = h[j]; y[0] = zv2; x[1] = h[j2]; y[1] = zv2; x[2] = h[j2]; y[2] = v[j3]; x[3] = h[j]; y[3] = v[j3]; g.fillPolygon(x, y, 4); } break; case 4: { int j2 = (i + 1) * ppi; x[0] = h[j]; y[0] = zv2; x[1] = h[j2]; y[1] = zv2; x[2] = h[j2]; y[2] = v[j2]; x[3] = h[j]; y[3] = v[j2]; g.fillPolygon(x, y, 4); } break; } } g.setColor(Color.blue); if (zv >= r.y && zv <= r.y + r.height) g.drawLine(r.x, zv, r.x + r.width, zv); g.setColor(Color.red); for (int i = 0; i < nint + 1; i ++) { int j = i * ppi; g.drawLine(h[j], zv2, h[j], v[j]); //if (shade == 1 && i % 2 == 0) // g.drawLine(h[j] + 1, zv2, h[j] + 1, v[j]); } for (int i = 0; i < h.length - 1; i ++) { //g.drawLine(h[i], v[i], h[i + 1], v[i + 1]); drawThickLine(g, h[i], v[i], h[i + 1], v[i + 1]); } g.setColor(Color.black); //g.drawString(h.length + " pts.", r.x + r.width + 10, r.y + 10); s = "Approximation"; g.drawString(s, r.x + r.width + 45, r.y + 10); g.drawLine(r.x + r.width + 45, r.y + 10 + g.getFontMetrics().getMaxDescent(), r.x + r.width + 45 + g.getFontMetrics().stringWidth(s), r.y + 10 + g.getFontMetrics().getMaxDescent()); if (int_trap != null) { if (shade == 0) g.setColor(Color.red); g.drawString("Trapezoid: ", r.x + r.width + 10, r.y + 30); g.drawString(format_num(int_trap.value, 6), r.x + r.width + 10 + 105, r.y + 30); if (shade == 0) g.setColor(Color.black); } if (int_simp != null) { if (shade == 1) g.setColor(Color.red); g.drawString("Simpson: ", r.x + r.width + 10, r.y + 45); if (nint % 2 == 0) g.drawString(format_num(int_simp.value, 6), r.x + r.width + 10 + 105, r.y + 45); else g.drawString("-Not applicable-", r.x + r.width + 10 + 105, r.y + 45); if (shade == 1) g.setColor(Color.black); } if (int_left != null) { if (shade == 2) g.setColor(Color.red); g.drawString("Left endpoint: ", r.x + r.width + 10, r.y + 60); g.drawString(format_num(int_left.value, 6), r.x + r.width + 10 + 105, r.y + 60); if (shade == 2) g.setColor(Color.black); } if (int_mid != null) { if (shade == 3) g.setColor(Color.red); g.drawString("Midpoint: ", r.x + r.width + 10, r.y + 75); g.drawString(format_num(int_mid.value, 6), r.x + r.width + 10 + 105, r.y + 75); if (shade == 3) g.setColor(Color.black); } if (int_right != null) { if (shade == 4) g.setColor(Color.red); g.drawString("Right endpoint: ", r.x + r.width + 10, r.y + 90); g.drawString(format_num(int_right.value, 6), r.x + r.width + 10 + 105, r.y + 90); if (shade == 4) g.setColor(Color.black); } } g.setColor(Color.blue); g.drawLine(r.x, r.y, r.x + r.width, r.y); g.drawLine(r.x + r.width, r.y, r.x + r.width, r.y + r.height); g.drawLine(r.x, r.y, r.x, r.y + r.height); g.drawLine(r.x, r.y + r.height, r.x + r.width, r.y + r.height); g2.drawImage(buf, 0, 0, this); } public void update(Graphics g) { paint(g); } void drawThickLine(Graphics g, int x0, int y0, int x1, int y1) { g.drawLine(x0, y0, x1, y1); g.drawLine(x0 + 1, y0, x1 + 1, y1); g.drawLine(x0, y0 + 1, x1, y1 + 1); g.drawLine(x0 + 1, y0 + 1, x1 + 1, y1 + 1); } public void draw(double x[], double y[], int ni) { set_rect(); h = new int[x.length]; xmin = x[0]; xmax = x[0]; for (int i = 0; i < x.length; i ++) if (x[i] > xmax) xmax = x[i]; else if (x[i] < xmin) xmin = x[i]; double dxdh = (r.width - 1) / (xmax - xmin); for (int i = 0; i < x.length; i ++) h[i] = (int) (r.x + (x[i] - xmin) * dxdh); v = new int[x.length]; ymin = y[0]; ymax = y[0]; for (int i = 0; i < x.length; i ++) if (y[i] > ymax) ymax = y[i]; else if (y[i] < ymin) ymin = y[i]; if (ymin == ymax) { ymin -= 1; ymax += 1; } double dydv = (r.height - 1) / (ymax - ymin); for (int i = 0; i < x.length; i ++) v[i] = (int) (r.y + r.height - 1 - (y[i] - ymin) * dydv); zv = (int) (r.y + r.height - (0 - ymin) * dydv); nint = ni; int_trap = new trapezoidal(x, y, nint); int_simp = new simpsons(x, y, nint); int_left = new leftpoint(x, y, nint); int_mid = new midpoint(x, y, nint); int_right = new rightpoint(x, y, nint); repaint(); } public void set_shade(int s) { shade = s; repaint(); } double lagrange(double x, double x1, double y1, double x2, double y2, double x3, double y3) { return y1 * (x - x2) * (x - x3) / (x1 - x2) / (x1 - x3) + y2 * (x - x1) * (x - x3) / (x2 - x1) / (x2 - x3) + y3 * (x - x1) * (x - x2) / (x3 - x1) / (x3 - x2); } void set_rect() { r = new Rectangle(75, 10, size().width / 2, size().height - 30); } String truncate_num(double x, int maxc) { String s = String.valueOf(x); String s2 = ""; int dec = 0; int count = 0; for (int i = 0; i < s.length(); i ++) { char c = s.charAt(i); if (c == '.') dec = 1; else if (Character.isDigit(c)) { if (dec == 1) { if (count >= maxc) continue; count ++; } } else dec = 0; if (!(c == '.' && maxc == 0)) s2 += c; } return s2; } String format_num(double x) { return format_num(x, 3); } String format_num(double x, int maxc) { double y = x; if (Double.isInfinite(y)) return new String("INF"); if (Double.isNaN(y)) return new String("NaN"); if (y == 0.0) return new String("0"); // no trailing zeros if (maxc < 0) maxc = 0; //double factor = Math.pow(10.0, (double) maxc); long factor = 1; for (int i = 0; i < maxc; i ++) factor *= 10; y = Math.rint(y * factor) / factor; return truncate_num(y, maxc); } public Dimension minimumSize() { Dimension d = getParent().size(); return new Dimension(d.width, (int) (d.height * 0.6)); } public Dimension preferredSize() { Dimension d = getParent().size(); return new Dimension(d.width, (int) (d.height * 0.6)); } }