public void draw(Graphics2D g) {
    F.addVariable("x", a);
    double fa = F.getValue();

    // draw tangent line
    double m;
    double[] P = toCartesianPoint(0, 0);
    double[] Q = toCartesianPoint(w, 0);
    g.setStroke(new BasicStroke(3.0f));
    try {
      m = Double.parseDouble(F.evaluate(F.differentiate(F.getTopNode(), "x")).toString());
      drawLine(g, P[0], fa + m * (P[0] - a), Q[0], fa + m * (Q[0] - a), Color.gray);
      applet.setStat("Slope \u2248 ", m, Color.red);
    } catch (ParseException e) {
    } catch (Exception e) {
    }

    // draw derivative from b to c
    try {
      double start = w / 2 + (b - originX) * scale;
      double stop = w / 2 + (c - originX) * scale;
      GeneralPath path = new GeneralPath();
      F.addVariable(variable, b);
      double y = Double.parseDouble(F.evaluate(F.differentiate(F.getTopNode(), "x")).toString());
      path.moveTo(start, (float) (h / 2 - (y - originY) * scale));
      while (start < stop) {
        F.addVariable(variable, (start - w / 2) / scale + originX);
        y = Double.parseDouble(F.evaluate(F.differentiate(F.getTopNode(), "x")).toString());
        path.lineTo(start, (float) (h / 2 - (y - originY) * scale));
        start++;
      }
      g.setColor(Color.red);
      g.setStroke(curve);
      g.draw(path);
    } catch (ParseException e) {
    } catch (Exception e) {
    }
  }
 public void drawEndpoints(Graphics2D g) {
   F.addVariable("x", a);
   drawPoint(g, a, F.getValue(), Color.red, overA);
   try {
     drawPoint(
         g,
         a,
         Double.parseDouble(F.evaluate(F.differentiate(F.getTopNode(), "x")).toString()),
         Color.red,
         false);
   } catch (ParseException e) {
   } catch (Exception e) {
   }
 }