// lg.java(ラグランジェ補間公式) // import java.applet.Applet; import java.awt.*; import java.io.*; import java.lang.*; import java.net.URL; import java.util.*; import java.applet.*; import java.awt.event.*; public class lg extends Applet { TextArea ta1,ta2; Button b; // Button b = new Button(""); Choice mychoice; int n_data=0; double x_max; double x_min; double y_max; double y_min; double a[]; double x_data[]; double y_data[]; double xg1; double xg2; double yg1; double yg2; Labo_Util labo; boolean drawn = false; // 初めに一度だけ実行するメソッド public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); ta1 = new TextArea("",10,60); ta2 = new TextArea("",10,60); ta2.setEditable(false); ta2.setBackground(new Color(255,255,232)); mychoice = new Choice(); mychoice.setBackground(Color.white); mychoice.addItem("x(linear) - y(linear)"); mychoice.addItem("x(log) - y(linear)"); mychoice.addItem("x(linear) - y(log) "); mychoice.addItem("x(log) - y(log) "); add(mychoice); add(b=new Button("")); b.addActionListener(new MyListener()); // add(b); add(ta1); add(ta2); setBackground(new Color(147,176,255)); setLayout((LayoutManager)null); ta1.setBounds(10,40,200,150); ta2.setBounds(10,210,200,150); b.setBounds(580,10,60,20); mychoice.setBounds(450,10,110,20); x_data = new double[3000]; y_data = new double[3000]; a = new double[501]; labo = new Labo_Util(); } // 結果のグラフィック表示 public void paint(Graphics g) { Font f_TimesRoman; f_TimesRoman = new Font("TimesRoman",Font.ITALIC,15); g.setFont(f_TimesRoman); g.drawString("Data Window",10,35); g.drawString("Answer...",10,205); g.drawString("Graph",230,35); g.setColor(Color.magenta); g.drawString("1997 N Labo.",540,375); // グラフィック座標等設定 int xx1=220; int xx2=640; int yy1=40; int yy2=360; double xc1; double xc2; double yc1; double yc2; g.setColor(new Color(255,255,232)); g.fillRect(xx1,yy1,xx2-xx1,yy2-yy1); g.setColor(Color.blue); if (drawn) { // データの最大値および最小値の計算 x_max=x_data[1]; x_min=x_data[1]; y_max=y_data[1]; y_min=y_data[1]; for (int i=1; i<=n_data; i++) { if (x_max < x_data[i]){x_max = x_data[i];}; if (y_max < y_data[i]){y_max = y_data[i];}; if (x_min > x_data[i]){x_min = x_data[i];}; if (y_min > y_data[i]){y_min = y_data[i];}; } double x1=(x_min+x_max)*0.5-(x_max-x_min)*0.8; double y1=(y_min+y_max)*0.5-(y_max-y_min)*0.8; double x2=(x_min+x_max)*0.5+(x_max-x_min)*0.8; double y2=(y_min+y_max)*0.5+(y_max-y_min)*0.8; xg1=(x_min+x_max)*0.5-(x_max-x_min)*0.6; yg1=(y_min+y_max)*0.5-(y_max-y_min)*0.6; xg2=(x_min+x_max)*0.5+(x_max-x_min)*0.6; yg2=(y_min+y_max)*0.5+(y_max-y_min)*0.6; // 枠線表示 g.setColor(Color.gray); g.drawRect(labo.mapping_x(xg1,x1,x2,xx1,xx2),labo.mapping_y(yg2,y1,y2,yy1,yy2), Math.abs(labo.mapping_x(xg2,x1,x2,xx1,xx2)-labo.mapping_x(xg1,x1,x2,xx1,xx2)), Math.abs(labo.mapping_y(yg2,y1,y2,yy1,yy2)-labo.mapping_y(yg1,y1,y2,yy1,yy2))); g.drawString("x",labo.mapping_x(xg1+(xg2-xg1)*1.05,x1,x2,xx1,xx2), labo.mapping_y(yg1+(yg2-yg1)*0.01,y1,y2,yy1,yy2)); g.drawString("y",labo.mapping_x(xg1-(xg2-xg1)*0.12,x1,x2,xx1,xx2), labo.mapping_y(yg1+(yg2-yg1)*0.98,y1,y2,yy1,yy2)); // X Label Linear if ( (mychoice.getSelectedIndex()==0) || (mychoice.getSelectedIndex()==2) ) { double dx=labo.round((xg2-xg1)/5); int i1=(int)Math.round(xg1/dx)-2; int i2=(int)Math.round(xg2/dx)+2; int p=labo.power(xg2); g.drawString("*10",labo.mapping_x(xg2,x1,x2,xx1,xx2), labo.mapping_y(yg1-(yg2-yg1)*0.12,y1,y2,yy1,yy2)); g.drawString(String.valueOf(p),labo.mapping_x(xg2+(xg2-xg1)*0.09,x1,x2,xx1,xx2), labo.mapping_y(yg1-(yg2-yg1)*0.09,y1,y2,yy1,yy2)); for (int i=i1; i<=i2; i++) { double xxx=i*dx; if((xxx>xg1) && (xxxxg1) && (xxxyg1) && (yyyyg1) && (yyy=yg1) && (yc1<=yg2) && (yc2>=yg1) && (yc2<=yg2) ) { g.drawLine(labo.mapping_x(xc1,x1,x2,xx1,xx2), labo.mapping_y(yc1,y1,y2,yy1,yy2), labo.mapping_x(xc2,x1,x2,xx1,xx2), labo.mapping_y(yc2,y1,y2,yy1,yy2)); } } } drawn=false; } // csv形式のStringオブジェクトから配列変数を作成 void data_aqui(String instr) { String s_tmp=""; boolean flag_ret=false; boolean flag_com=false; n_data = 0; for (int i=0; i<=instr.length()-1; i++) { if(instr.charAt(i) == '\n'){flag_ret=true;}; if((instr.charAt(i) == ',') || (instr.charAt(i) == '\t')){flag_com=true;}; if(flag_com || flag_ret) { if (flag_ret) { y_data[n_data+1]=labo.String2double(s_tmp); s_tmp=""; n_data++; flag_ret=false; } if (flag_com) { x_data[n_data+1]=labo.String2double(s_tmp); s_tmp=""; flag_com=false; } } else { s_tmp=s_tmp+instr.charAt(i); } } } void sorting() { int i; int j; double xx1; double xx2; double yy1; double yy2; for (i=1; i<=n_data-1; i++) { for (j=i+1; j<=n_data; j++) { if (x_data[i]>x_data[j]) { xx1=x_data[i]; yy1=y_data[i]; xx2=x_data[j]; yy2=y_data[j]; x_data[i]=xx2; y_data[i]=yy2; x_data[j]=xx1; y_data[j]=yy1; } } } } // ラグランジェの補間公式 Main Engine void lg() { // ソーティング sorting(); for (int p=1; p<=n_data; p++) { double m=1; for (int n=1; n<=n_data; n++) { if ( p != n ) { m=m*(x_data[p]-x_data[n]); } } a[p]=y_data[p]/m; } } // ボタンを押したら実行するメソッド /* public boolean action(Event e,Object o) { if(e.target instanceof Button) { // データ取得 String instr = ta1.getText(); //テキストエリア1よりStringをゲット if (instr.charAt(instr.length()-1) !='\n') { instr=instr+"\n"; } data_aqui(instr); int ii=0; for (int i=1; i<=n_data; i++) { if(mychoice.getSelectedIndex()==0) { ii=ii+1; } if(mychoice.getSelectedIndex()==1) { if (x_data[i]>0){ii=ii+1; x_data[ii]=Math.log(x_data[i]);} } if(mychoice.getSelectedIndex()==2) { if (y_data[i]>0){ii=ii+1; y_data[ii]=Math.log(y_data[i]);} } if(mychoice.getSelectedIndex()==3) { if ((x_data[i]>0) && (y_data[i]>0)) { ii=ii+1; x_data[ii]=Math.log(x_data[i]); y_data[ii]=Math.log(y_data[i]); } } } n_data=ii; // ラグランジェ補間公式 lg(); // 結果表示 ta2.replaceRange("start..."+"\n",0,30000); for (int i=1; i<=n_data; i++) { ta2.append("a["+String.valueOf(i)+"]="+String.valueOf(a[i])+"\n"); } // グラフ表示 String label = o.toString(); if(label.equals("")) { drawn = true; repaint(); } } return true; } */ class MyListener implements ActionListener{ public void actionPerformed(ActionEvent e) { if(e.getSource()==b){ // データ取得 String instr = ta1.getText(); //テキストエリア1よりStringをゲット if (instr.charAt(instr.length()-1) !='\n') { instr=instr+"\n"; } data_aqui(instr); int ii=0; for (int i=1; i<=n_data; i++) { if(mychoice.getSelectedIndex()==0) { ii=ii+1; } if(mychoice.getSelectedIndex()==1) { if (x_data[i]>0){ii=ii+1; x_data[ii]=Math.log(x_data[i]);} } if(mychoice.getSelectedIndex()==2) { if (y_data[i]>0){ii=ii+1; y_data[ii]=Math.log(y_data[i]);} } if(mychoice.getSelectedIndex()==3) { if ((x_data[i]>0) && (y_data[i]>0)) { ii=ii+1; x_data[ii]=Math.log(x_data[i]); y_data[ii]=Math.log(y_data[i]); } } } n_data=ii; // ラグランジェ補間公式 lg(); // 結果表示 ta2.replaceRange("start..."+"\n",0,30000); for (int i=1; i<=n_data; i++) { ta2.append("a["+String.valueOf(i)+"]="+String.valueOf(a[i])+"\n"); } // グラフ表示 // String label = o.toString(); if(e.getSource()==b) { drawn = true; repaint(); } } } } }