protected void paintComponent(Graphics g) { int width = getWidth(); // Paint background if we're opaque. if (isOpaque()) { g.setColor(getBackground()); g.fillRect(0, 0, width, getHeight()); } g.setColor(getForeground()); double step = ((double) width) / fvar.getStepNumber(); double lastX = 0; double newX; int lastY = getY(fvar.getStepValue(0)); int newy; for (int i = 0; i < fvar.getStepNumber(); i++) { newy = getY(fvar.getStepValue(i + 1)); newX = lastX + step; g.drawLine((int) lastX, lastY, (int) newX, newy); lastY = newy; lastX = newX; } if (lastX < (double) width) { g.drawLine((int) lastX, lastY, width, lastY); } }
/** converts the mouse's y into the corresponding value in the function's range */ protected double realY(int mouseY) { if (fvar.isConstant()) return fvar.getYmax(); int h = getHeight(); double ymax = fvar.getYmax(); return ymax + (fvar.getYmin() - ymax) * (mouseY - h * (1 - croppingFactor) * 0.5) / h / croppingFactor; }
/** converts some y in the fun's range into a mouse y coordinate */ protected int getY(double y) { int h = getHeight(); if (fvar.isConstant()) return (int) h / 2; else { double ymax = fvar.getYmax(); return (int) ((h * (1 - croppingFactor) / 2.0) + h * croppingFactor * (y - ymax) / (fvar.getYmin() - ymax)); } }
/** * Builds a top-level window from the variations of a function * * @see FunctionVariations */ public CurveFrame(FunctionVariations fvar) { super("Curve"); tracer = new CurveTracer(fvar); infos = new CurveInfos(fvar); controls = new CurveControls(fvar, this); JPanel mainPane = new JPanel(new BorderLayout()); mainPane.add(tracer, BorderLayout.CENTER); mainPane.add(infos, BorderLayout.SOUTH); mainPane.add(controls, BorderLayout.EAST); tracer.addMouseListener( new MouseAdapter() { CurveFrame cf = CurveFrame.this; public void mouseEntered(MouseEvent e) { cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX())); cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY())); cf.infos.repaint(); } public void mouseExited(MouseEvent e) { cf.infos.xmouse.setText(""); cf.infos.ymouse.setText(""); cf.infos.repaint(); } }); tracer.addMouseMotionListener( new MouseMotionAdapter() { CurveFrame cf = CurveFrame.this; public void mouseMoved(MouseEvent e) { cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX())); cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY())); // cf.infos.repaint(); } public void mouseDragged(MouseEvent e) { cf.infos.xmouse.setText("x = " + cf.tracer.realX(e.getX())); cf.infos.ymouse.setText("y = " + cf.tracer.realY(e.getY())); cf.infos.repaint(); } }); fvar.tabulate(controls.currentPrecision()); setContentPane(mainPane); pack(); infos.update(); setVisible(true); }
/** converts the mouse's x into some value of the considered interval. correction 29/03/1999 */ protected double realX(int mouseX) { double xmin = fvar.getXmin(); return xmin + (mouseX * (fvar.getXmax() - xmin) / getWidth()); }