/*
* -------------------------------------------------------------------------
* $Id: Area.java,v 1.7 2004/09/01 18:05:26 estewart Exp $
* -------------------------------------------------------------------------
* Copyright (c) 1999 Visual Numerics Inc. All Rights Reserved.
*
* This software is confidential information which is proprietary to
* and a trade secret of Visual Numerics, Inc. Use, duplication or
* disclosure is subject to the terms of an appropriate license
* agreement.
*
* VISUAL NUMERICS MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. VISUAL
* NUMERICS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
* AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
* ITS DERIVATIVES.
*--------------------------------------------------------------------------
*/
package com.imsl.demo.javagrande;
import com.imsl.chart.*;
import com.imsl.math.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
public class Area extends Applet
implements MouseListener, MouseMotionListener {
private Chart chart = null;
private AxisXY axis;
static private final int npoints = 100;
private double x[], y[];
private double upperLimit = 2.0;
private Data dataLow, dataHigh;
private Data dataValue;
private Data dataError;
Quadrature.Function f;
private void solve() {
Quadrature q = new Quadrature();
q.setRule(1);
double value = q.eval(f, 0.0, upperLimit);
dataValue.setTitle("integral = "+value);
}
public void init() {
f = new Quadrature.Function() {
public double f(double x) {
return 1.0/(1.0+x*x);
}
};
x = new double[npoints];
y = new double[npoints];
for (int k = 0; k < npoints; k++) {
x[k] = 10.0*k / (npoints-1);
y[k] = f.f(x[k]);
}
chart = new Chart(this);
axis = new AxisXY(chart);
axis.getAxisX().getAxisTitle().setTitle("x");
axis.getAxisY().getAxisTitle().setTitle("y");
double px[] = {5};
double py[] = {0.5};
dataValue = new Data(axis, px, py);
dataValue.setLabelType(Data.LABEL_TYPE_TITLE);
dataValue.setTitle("integral = ");
dataValue.setTextColor(Color.blue);
double ex[] = {5};
double ey[] = {0.4};
dataError = new Data(axis, ex, ey);
dataError.setLabelType(Data.LABEL_TYPE_TITLE);
dataError.setTextColor(Color.red);
updateUpperLimit();
addMouseListener(this);
addMouseMotionListener(this);
}
public void update(Graphics g) {
chart.update(g);
}
public void paint(Graphics g) {
chart.paint(g);
}
public void mouseMoved(MouseEvent event) {
}
public void mouseDragged(MouseEvent event) {
double point[] = {0, 0};
axis.mapDeviceToUser(event.getX(), event.getY(), point);
upperLimit = point[0];
updateUpperLimit();
}
public void mouseClicked(MouseEvent event) {
double point[] = {0, 0};
axis.mapDeviceToUser(event.getX(), event.getY(), point);
upperLimit = point[0];
updateUpperLimit();
}
private void updateUpperLimit() {
int nSplit;
for (nSplit = 0; nSplit < npoints-1; nSplit++) {
if (x[nSplit] > upperLimit) break;
}
int nLow = Math.min(npoints, nSplit+1);
double xs[] = new double[nLow];
double ys[] = new double[nLow];
System.arraycopy(x, 0, xs, 0, nLow);
System.arraycopy(y, 0, ys, 0, nLow);
if (dataLow != null)
dataLow.remove();
dataLow = new Data(axis, xs, ys);
dataLow.setDataType(Data.DATA_TYPE_FILL);
dataLow.setFillColor(Color.blue);
int nHigh = Math.min(npoints, npoints-nSplit);
xs = new double[nHigh];
ys = new double[nHigh];
System.arraycopy(x, nSplit, xs, 0, nHigh);
System.arraycopy(y, nSplit, ys, 0, nHigh);
if (dataHigh != null)
dataHigh.remove();
dataHigh = new Data(axis, xs, ys);
dataHigh.setDataType(Data.DATA_TYPE_FILL);
dataHigh.setFillColor(Color.yellow);
solve();
dataError.setTitle("");
repaint();
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public static void main(String argv[]) {
Area ex = null;
Frame frame = new Frame();
ex = new Area();
frame.add(ex);
ex.init();
frame.setSize(new Dimension(400,400));
frame.show();
}
}