?? insert.java
字號:
import java.awt.*;
import java.awt.event.*;
/**
*
*
* @author bobo
* @version 1.00 04/11/04
*/
public class insert{
public static int X[]=new int[20],Y[]=new int[20];
public static int i=0,f;
public static void main(String args[]){
Frame f=new Frame("三種插值算法");
Panel p1=new Panel();
Panel p2=new Panel();
Panel p3=new Panel();
Button b4=new Button("拉格朗日插值");
Button b5=new Button("牛頓插值");
Button b6=new Button("三次自然樣條插值");
Button b7=new Button("CLEAN");
Listener1 bh1=new Listener1(f);
Listener2 bh2=new Listener2(p1);
Listener3 bh3=new Listener3(p1);
Listener4 bh4=new Listener4(p1);
Listener5 bh5=new Listener5(p1);
Listener6 bh6=new Listener6(p1);
f.addWindowListener(bh1);
p1.addMouseListener(bh2);
b4.addActionListener(bh3);
b5.addActionListener(bh4);
b6.addActionListener(bh5);
b7.addActionListener(bh6);
p2.add(b4);
p2.add(b5);
p2.add(b6);
p2.add(b7);
p2.setBackground(Color.yellow);
p3.setBackground(Color.yellow);
f.add(p1,"Center");
f.add(p2,"North");
f.add(p3,"South");
f.setSize(800,600);
f.setVisible(true);
}
}
class Listener1 extends WindowAdapter{ //關閉窗口的監視器。
Listener1(Frame f){
this.f=f;
}
private Frame f;
public void windowClosing(WindowEvent e){
System.exit(0);
}
} //用鼠標點出任意個點,獲得他們的坐標,并在圖中表出來.
class Listener2 extends MouseAdapter{
Listener2(Panel p1){
this.p1=p1;
}
private Panel p1;
public void mouseClicked(MouseEvent e){
insert.X[insert.i]=e.getX();
insert.Y[insert.i]=e.getY();
p1.getGraphics().drawString("x",e.getX()-1,e.getY()+3);
insert.i++;
}
}
class Listener3 implements ActionListener{ //拉格朗日插植算法連線。
Listener3(Panel p1){
this.p1=p1;
}
private Panel p1;
private int b,j,int_s,k;
private double double_y,s,xn,xm;
public void actionPerformed(ActionEvent e){
for(b=insert.X[0]+1;b<=insert.X[insert.i-1];b++){
s=0;
for(k=0;k<=(insert.i-1);k++){
double_y=(double)insert.Y[k];
for(j=0;j<=(insert.i-1);j++){
xm=(double)insert.X[j];
xn=(double)insert.X[k];
if(j!=k)
double_y=double_y*(b-xm)/(xn-xm);
}
s=s+double_y;
}
int_s=(int)s;
Graphics g=p1.getGraphics();
g.setColor(Color.blue);
for(j=0;j<100000;j++);
g.drawString(".",b,int_s);g.drawString("拉格朗日插值",5,15);
}
}
}
class Listener4 implements ActionListener{ //牛頓插值算法連線
Listener4(Panel p1){
this.p1=p1;
}
private Panel p1;
private int j,k,int_p,b;
private double d[]=new double[20];
private double double_X[]=new double[20];
private double p;
public void actionPerformed(ActionEvent e){ //計算牛頓插值算法中的系數d[i]。
for(j=0;j<=(insert.i-1);j++){
d[j]=(double)insert.Y[j];
double_X[j]=(double)insert.X[j];
}
for(k=1;k<=(insert.i-1);k++){
for(j=(insert.i-1);j>=k;j--) d[j]=(d[j]-d[j-1])/(double_X[j]-double_X[j-k]);
}
for(b=insert.X[0]+1;b<=insert.X[insert.i-1];b++){
p=d[insert.i-1];for(j=(insert.i-2);j>=0;j--) p=d[j]+p*(b-double_X[j]);
int_p=(int)p;
Graphics g=p1.getGraphics();
g.setColor(Color.black);
for(j=0;j<100000;j++);
g.drawString(".",b,int_p);g.drawString("牛頓插值",5,30);
}
}
}
class Listener5 implements ActionListener{ //三次自然樣條插值算法連線。
Listener5(Panel p1){
this.p1=p1;
}
private Panel p1;
private double a[]=new double[20];
private double b[]=new double[20];
private double c[]=new double[20];
private double d[]=new double[20];
private double h[]=new double[20];
private double s2[]=new double[20];
private int int_s,j,k;
private double s,s1;
public void actionPerformed(ActionEvent e){
for(j=0;j<(insert.i-1);j++){
h[j]=insert.X[j+1]-insert.X[j];
}
a[1]=2*(h[0]+h[1]);
for(j=2;j<(insert.i-1);j++){
a[j]=2*(h[j-1]+h[j])-h[j+1]*h[j+1]/a[j-1];
}
for(j=1;j<insert.i;j++){
c[j]=(insert.Y[j]-insert.Y[j-1])/h[j-1];
}
for(j=1;j<(insert.i-1);j++){
d[j]=6*(c[j+1]-c[j]);
}
b[1]=d[1];
for(j=2;j<(insert.i-1);j++){
b[j]=d[j]-b[j-1]*h[j-1]/a[j-1];
}
s2[insert.i-2]=b[insert.i-2]/a[insert.i-2];
for(j=(insert.i-3);j>0;j--){
s2[j]=(b[j]-h[j]*s2[j+1])/a[j];
}
s2[0]=0;s2[insert.i-1]=0;
for(j=0;j<(insert.i-1);j++){
insert.f=insert.X[j];
while(insert.f<=insert.X[j+1]){
CalculateS(j);}
}
}
void CalculateS(int k){
s1=c[k+1]-s2[k+1]*h[k]/6-s2[k]*h[k]/3;
s=insert.Y[k]+s1*(insert.f-insert.X[k])+s2[k]*(insert.f-insert.X[k])*(insert.f-insert.X[k])/2+(s2[k+1]-s2[k])*((insert.f-insert.X[k])*(insert.f-insert.X[k])*(insert.f-insert.X[k]))/(6*h[k]);
int_s=(int)s;
Graphics g=p1.getGraphics();
g.setColor(Color.red);
g.drawString(".",insert.f,int_s);
for(int j=0;j<100000;j++);
g.drawString("三次自然樣條插值", 5, 45);
insert.f++;
}
}
class Listener6 implements ActionListener{
Listener6(Panel p1){
this.p1=p1;
}
private Panel p1;
public void actionPerformed(ActionEvent e){
p1.repaint();
for(int i=0;i<20;i++){
insert.X[i]=0;insert.Y[i]=0;
}
insert.f=0;insert.i=0;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -