Lagrangesrc.txt |
Matrix points; | //interpolating points |
int numpoints; |
Matrix mat; | //used to precompute basis functions |
Image offscreenImg; | //used in double buffering |
Graphics offscreenG; |
double[] t; | //time values |
static final int k = 100; //number of partitions |
int moveflag; | //the point being moved, if any |
Button restart; |
Button addpoint; |
Button subpoint; |
boolean go = false; | //for restart button |
boolean addpt = false; //flag for add point button |
boolean subpt = false; //flag for subtracting point button |
//used to initialize the applet |
public void init() { |
//start off with 5 points |
numpoints = 5; |
startagain(); |
//create time interval [0,1] with k partitions |
t = new double[k+1]; |
for(int i=0;i<=k;i++) |
t[i] = (double)i/(double)k; |
//create matrix with current info |
create(); |
//create offscreen buffer |
offscreenImg = createImage(size().width,size().height); |
offscreenG = offscreenImg.getGraphics(); |
restart = new Button("Restart"); |
add(restart); |
addpoint = new Button("Add Point"); |
add(addpoint); |
subpoint = new Button("Subtract Point"); |
add(subpoint); |
} |
//precompute the basis functions for Lagrange polynomials and evaluate |
//over the time interval, store in matrix |
public void create() { |
mat = new Matrix(numpoints,k+1); |
1 |
Lagrangesrc.txt |
double c; |
for(int i=0;i<mat.rowsize();i++) |
for(int j=0;j<mat.colsize();j++) { |
c=1; |
for(int h=0;h<numpoints;h++) |
if(h!=i) |
//calculate i,j position of matrix |
c *= (t[j]-(double)h/(double)(numpoints-1))/ |
((double)i/(double)(numpoints-1)- |
(double)h/(double)(numpoints-1)); |
mat.set(i,j,c); |
} |
//transpose matrix for later calculations |
mat.trans(); |
paint(g); |
if (e.target == restart) { |
go = true; |
repaint(); |
return true; |
} |
else if(e.target == addpoint) { |
addpt = true; |
repaint(); |
return true; |
} |
else if(e.target == subpoint) { |
if(numpoints>2) { |
subpt = true; |
repaint(); |
} |
return true; |
} |
return false; |
moveflag = numpoints; |
points = new Matrix(numpoints,2); |
double increment = (double)(size().width-60)/(double)(numpoints-1); |
for(int i=0;i<numpoints;i++){ |
points.set(i,0,(i*increment)+30.0); |
points.set(i,1,(double)size().height/2.0); |
} |
2 |
Lagrangesrc.txt |
//prepare buffered screen for plot |
setBackground(Color.white); |
offscreenG.setColor(Color.white); |
offscreenG.fillRect(0,0,size().width,size().height); |
offscreenG.setColor(Color.black); |
//if adding a point, create a new matrix and new set of points |
if(addpt) { |
numpoints++; |
startagain(); |
create(); |
addpt = false; |
} |
//if subtracting a point, create new matrix and new set of points |
if(subpt) { |
numpoints--; |
startagain(); |
create(); |
subpt = false; |
} |
//if restart button, start all over |
if(go) { |
startagain(); |
go = false; |
} |
//Display number of points |
offscreenG.drawString("Points = "+String.valueOf(numpoints),20,20); |
//plot points |
for(int i=0;i<numpoints;i++) |
offscreenG.fillOval((int)points.get(i,0)-2, |
(int)points.get(i,1)-2,4,4); |
//draw interpolating polynomial by multiplying precomputed basis |
function |
//matrix by the points, thus taking a linear combination, and plotting |
output |
Matrix plot = new Matrix(mat.mult(points)); |
for(int i=0;i<plot.rowsize()-1;i++) |
//must round off the doubles in the matrix |
offscreenG.drawLine((int)Math.round(plot.get(i,0)), |
(int)Math.round(plot.get(i,1)), |
(int)Math.round(plot.get(i+1,0)), |
(int)Math.round(plot.get(i+1,1))); |
//draw image from buffer to screen |
g.drawImage(offscreenImg,0,0,this); |
Point p = new Point(x,y); |
for(int i=0;i<numpoints;i++) |
3 |
Lagrangesrc.txt |
for(int j=-2;j<3;j++) |
for(int l=-2;l<3;l++) |
if(p.equals(new Point((int)points.get(i,0)+j, |
(int)points.get(i,1)+l))) |
//set moveflag to the point being moved |
moveflag=i; |
return true; |
} |
public boolean mouseDrag(Event evt, int x, int y) { |
//check if user is trying to drag an old point |
if(moveflag < numpoints) { |
//change the point being moved and redraw screen |
points.set(moveflag,0,x); |
points.set(moveflag,1,y); |
repaint(); |
} |
return true; |
} |
public boolean mouseUp(Event evt, int x, int y) { |
moveflag = numpoints; |
return true; |
} |
4 |