// pump2b.java(羽根車2円弧法 Ver.2.0) // 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 pump2b extends Applet { TextArea ta2; TextField tf1,tf2,tf3,tf4,tf5,tf6,tf7; Button btn1; Button btn2; Button btn3; Button btn4; Button btn5; Button btn6; Button btn7; Button btn8; Button btn9; // Button btn1 = new Button(""); // Button btn2 = new Button("<<-"); // Button btn3 = new Button("->>"); // Button btn4 = new Button("<-"); // Button btn5 = new Button("->"); // Button btn6 = new Button("LL"); // Button btn7 = new Button("SS"); // Button btn8 = new Button("L"); // Button btn9 = new Button("S"); Choice mychoice; double x_max; double y_max; double x_min; double y_min; double d1; double d2; double beta1; double beta2; double xp1; double yp1; double xp2; double yp2; double xp3; double yp3; double xp4; double yp4; double xp5; double yp5; double xp6; double yp6; double xp7; double yp7; double xp8; double yp8; double xp9; double yp9; double xp10; double yp10; double radius1; double radius2; double a1; double b1; double a2; double b2; double a3; double b3; double th; double th1; double th2; int alpha1; int alpha2; int alpha11; int alpha22; int alpha3; int m; double r0; double cx=0; double cy=60; double cw=10; double ch=10; double cr=10; int dtheta1=1; int dtheta2=3; boolean drawn = true, circle =true; double angle; double xx; double yy; Labo_Util labo; // 初めに一度だけ実行するメソッド public void init() { setLayout(new FlowLayout(FlowLayout.LEFT)); ta2 = new TextArea("",10,60); tf1 = new TextField("100"); tf2 = new TextField("200"); tf3 = new TextField("14"); tf4 = new TextField("22.5"); tf5 = new TextField("50"); tf6 = new TextField("110"); tf7 = new TextField("60"); ta2.setEditable(false); ta2.setBackground(new Color(255,255,232)); mychoice = new Choice(); mychoice.setBackground(Color.white); mychoice.addItem("6"); mychoice.addItem("7"); mychoice.addItem("8"); mychoice.addItem("9"); mychoice.addItem("10"); mychoice.addItem("11"); mychoice.addItem("12"); add(mychoice); add(btn1=new Button("")); add(btn2=new Button("<<-")); add(btn3=new Button("->>")); add(btn4=new Button("<-")); add(btn5=new Button("->")); add(btn6=new Button("LL")); add(btn7=new Button("SS")); add(btn8=new Button("L")); add(btn9=new Button("S")); btn1.addActionListener(new MyListener()); btn2.addActionListener(new MyListener()); btn3.addActionListener(new MyListener()); btn4.addActionListener(new MyListener()); btn5.addActionListener(new MyListener()); btn6.addActionListener(new MyListener()); btn7.addActionListener(new MyListener()); btn8.addActionListener(new MyListener()); btn9.addActionListener(new MyListener()); // add(btn1); // add(btn2); // add(btn3); // add(btn4); // add(btn5); // add(btn6); // add(btn7); // add(btn8); // add(btn9); add(ta2); add(tf1); add(tf2); add(tf3); add(tf4); add(tf5); add(tf6); add(tf7); setBackground(new Color(147,176,255)); setLayout((LayoutManager)null); tf1.setBounds(110,40,50,20); tf2.setBounds(110,70,50,20); tf3.setBounds(110,100,50,20); tf4.setBounds(110,130,50,20); tf5.setBounds(110,190,50,20); tf6.setBounds(110,220,50,20); tf7.setBounds(110,250,50,20); ta2.setBounds(220,400,320,90); btn1.setBounds(470,10,60,20); //キー処理 btn2.setBounds(55,380,20,20); //R btn3.setBounds(145,380,20,20); //L btn4.setBounds(80,380,20,20); //r btn5.setBounds(120,380,20,20); //l btn6.setBounds(100,335,20,20); //LL btn7.setBounds(100,425,20,20); //SS btn8.setBounds(100,360,20,20); //L btn9.setBounds(100,400,20,20); //S mychoice.setBounds(110,160,50,20); labo = new Labo_Util(); } //グラフィック座標変換 int scale(double x, double x_min, double x_max, int xx1, int xx2) { int yy=(int)( x* (double)(xx2-xx1)/(x_max-x_min) ); return yy; } // 結果のグラフィック表示 public void paint(Graphics g) { Font f_TimesRoman; f_TimesRoman = new Font("TimesRoman",Font.ITALIC,15); g.setFont(f_TimesRoman); g.drawString("D1........",30,55); g.drawString("D2........",30,85); g.drawString("beta1(deg)",30,115); g.drawString("beta2(deg)",30,145); g.drawString("Z.........",30,175); g.drawString("r2........",30,205); g.drawString("angle.....",30,235); g.drawString("r0........",30,265); g.drawString("Answer...",230,395); g.drawString("Graph",230,35); // グラフィック座標等設定 x_min=-0.5*d2; x_max=0.5*d2; y_min=-0.5*d2; y_max=0.5*d2; double x1=(x_min+x_max)*0.5-(x_max-x_min)*0.5; double y1=(y_min+y_max)*0.5-(y_max-y_min)*0.5; double x2=(x_min+x_max)*0.5+(x_max-x_min)*0.5; double y2=(y_min+y_max)*0.5+(y_max-y_min)*0.5; int xx1=220; int xx2=540; 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) { g.setColor(new Color(255,255,232)); g.fillRect(xx1,yy1,xx2-xx1,yy2-yy1); g.setColor(Color.gray); g.drawLine(labo.mapping_x(xp1,x1,x2,xx1,xx2), labo.mapping_y(-0.5*d2,y1,y2,yy1,yy2), labo.mapping_x(xp2,x1,x2,xx1,xx2), labo.mapping_y(yp2,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(-0.5*d2,x1,x2,xx1,xx2), labo.mapping_y(yp1,y1,y2,yy1,yy2), labo.mapping_x(0.5*d2,x1,x2,xx1,xx2), labo.mapping_y(yp1,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp1,x1,x2,xx1,xx2), labo.mapping_y(yp1,y1,y2,yy1,yy2), labo.mapping_x(xp4,x1,x2,xx1,xx2), labo.mapping_y(yp4,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp4,x1,x2,xx1,xx2), labo.mapping_y(yp4,y1,y2,yy1,yy2), labo.mapping_x(xp5,x1,x2,xx1,xx2), labo.mapping_y(yp5,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp5,x1,x2,xx1,xx2), labo.mapping_y(yp5,y1,y2,yy1,yy2), labo.mapping_x(xp3,x1,x2,xx1,xx2), labo.mapping_y(yp3,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp6,x1,x2,xx1,xx2), labo.mapping_y(yp6,y1,y2,yy1,yy2), labo.mapping_x(xp7,x1,x2,xx1,xx2), labo.mapping_y(yp7,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp2,x1,x2,xx1,xx2), labo.mapping_y(yp2,y1,y2,yy1,yy2), labo.mapping_x(xp7,x1,x2,xx1,xx2), labo.mapping_y(yp7,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp7,x1,x2,xx1,xx2), labo.mapping_y(yp7,y1,y2,yy1,yy2), labo.mapping_x(xp5,x1,x2,xx1,xx2), labo.mapping_y(yp5,y1,y2,yy1,yy2)); g.drawLine(labo.mapping_x(xp5,x1,x2,xx1,xx2), labo.mapping_y(yp5,y1,y2,yy1,yy2), labo.mapping_x(xp8,x1,x2,xx1,xx2), labo.mapping_y(yp8,y1,y2,yy1,yy2)); g.drawArc(labo.mapping_x(-0.5*d2,x1,x2,xx1,xx2), labo.mapping_y(0.5*d2,y1,y2,yy1,yy2), scale(d2,x_min,x_max,yy1,yy2), scale(d2,x_min,x_max,yy1,yy2), 0,360); g.drawArc(labo.mapping_x(-0.5*d1,x1,x2,xx1,xx2), labo.mapping_y(0.5*d1,y1,y2,yy1,yy2), scale(d1,x_min,x_max,yy1,yy2), scale(d1,x_min,x_max,yy1,yy2), 0,360); g.setColor(Color.magenta); g.drawArc(labo.mapping_x(xp7-radius1,x1,x2,xx1,xx2), labo.mapping_y(yp7+radius1,y1,y2,yy1,yy2), scale(radius1*2,x_min,x_max,yy1,yy2), scale(radius1*2,x_min,x_max,yy1,yy2), alpha1,alpha2-alpha1); g.setColor(Color.green); g.drawArc(labo.mapping_x(xp5-radius2,x1,x2,xx1,xx2), labo.mapping_y(yp5+radius2,y1,y2,yy1,yy2), scale(radius2*2,x_min,x_max,yy1,yy2), scale(radius2*2,x_min,x_max,yy1,yy2), alpha11,alpha22-alpha11); g.setColor(Color.magenta); for (int i=1; i<=m; i++) { angle=labo.kakudo(xp7,yp7); xp9=Math.sqrt(xp7*xp7+yp7*yp7)*Math.cos(angle+2*i*Math.PI/m); yp9=Math.sqrt(xp7*xp7+yp7*yp7)*Math.sin(angle+2*i*Math.PI/m); angle=labo.kakudo(xp8,yp8); xp10=0.5*d1*Math.cos(angle+2*i*Math.PI/m); yp10=0.5*d1*Math.sin(angle+2*i*Math.PI/m); angle=labo.kakudo(xp10-xp9,yp10-yp9); alpha3=(int)(angle*180/Math.PI); g.drawArc(labo.mapping_x(xp9-radius1,x1,x2,xx1,xx2), labo.mapping_y(yp9+radius1,y1,y2,yy1,yy2), scale(radius1*2,x_min,x_max,yy1,yy2), scale(radius1*2,x_min,x_max,yy1,yy2), alpha3,alpha2-alpha1); } g.setColor(Color.green); for (int i=1; i<=m; i++) { angle=labo.kakudo(xp5,yp5); xp9=Math.sqrt(xp5*xp5+yp5*yp5)*Math.cos(angle+2*i*Math.PI/m); yp9=Math.sqrt(xp5*xp5+yp5*yp5)*Math.sin(angle+2*i*Math.PI/m); angle=labo.kakudo(xp4,yp4); if (xp4<0) { angle=Math.PI+Math.atan(yp4/xp4); } else { angle=Math.atan(yp4/xp4); if (yp4<0){angle=angle+2*Math.PI; }; }; xp10=0.5*d1*Math.cos(angle+2*i*Math.PI/m); yp10=0.5*d1*Math.sin(angle+2*i*Math.PI/m); angle=labo.kakudo(xp10-xp9,yp10-yp9); alpha3=(int)(angle*180/Math.PI); g.drawArc(labo.mapping_x(xp9-radius2,x1,x2,xx1,xx2), labo.mapping_y(yp9+radius2,y1,y2,yy1,yy2), scale(radius2*2,x_min,x_max,yy1,yy2), scale(radius2*2,x_min,x_max,yy1,yy2), alpha3,alpha22-alpha11); } if(circle) { //軌道 g.setColor(new Color(187,138,253)); g.drawOval(labo.mapping_x(-r0,x1,x2,xx1,xx2), labo.mapping_y(r0,y1,y2,yy1,yy2), scale(2*r0,x_min,x_max,yy1,yy2), scale(2*r0,x_min,x_max,yy1,yy2)); cw=2*cr; ch=2*cr; g.setColor(Color.red); g.drawOval(labo.mapping_x(cx-cr,x1,x2,xx1,xx2), labo.mapping_y(cy+cr,y1,y2,yy1,yy2), scale(cw,x_min,x_max,yy1,yy2), scale(ch,x_min,x_max,yy1,yy2)); g.setColor(Color.pink); g.drawLine(labo.mapping_x(cx,x1,x2,xx1,xx2), labo.mapping_y(cy,y1,y2,yy1,yy2), labo.mapping_x(cx+cr*Math.cos(Math.PI*0.25),x1,x2,xx1,xx2), labo.mapping_y(cy+cr*Math.sin(Math.PI*0.25),y1,y2,yy1,yy2)); g.setColor(Color.black); g.drawString("ra="+String.valueOf(Math.round(cr)), labo.mapping_x(cx+cr*Math.cos(Math.PI*0.25)*0.5,x1,x2,xx1,xx2), labo.mapping_y(cy+cr*Math.sin(Math.PI*0.25)*0.5,y1,y2,yy1,yy2)); g.setColor(Color.pink); g.drawLine(labo.mapping_x(xp1,x1,x2,xx1,xx2), labo.mapping_y(yp1,y1,y2,yy1,yy2), labo.mapping_x(r0*Math.cos(Math.PI*1.75),x1,x2,xx1,xx2), labo.mapping_y(r0*Math.sin(Math.PI*1.75),y1,y2,yy1,yy2)); g.setColor(Color.black); g.drawString("r0", labo.mapping_x(r0*Math.cos(Math.PI*1.75)*0.5,x1,x2,xx1,xx2), labo.mapping_y(r0*Math.sin(Math.PI*1.75)*0.5,y1,y2,yy1,yy2)); } }; } // ボタンを押したら実行するメソッド /* public boolean action(Event e,Object o) { // d1,d2,beta1,beta2の取得 String instr1 = tf1.getText(); //テキストフィールド1よりStringをゲット d1 = labo.String2double(instr1); String instr2 = tf2.getText(); //テキストフィールド2よりStringをゲット d2 = labo.String2double(instr2); String instr3 = tf3.getText(); //テキストフィールド3よりStringをゲット beta1 = labo.String2double(instr3); String instr4 = tf4.getText(); //テキストフィールド4よりStringをゲット beta2 = labo.String2double(instr4); String instr5 = tf5.getText(); //テキストフィールド5よりStringをゲット radius2 = labo.String2double(instr5); String instr6 = tf6.getText(); //テキストフィールド6よりStringをゲット th = labo.String2double(instr6); m=mychoice.getSelectedIndex()+6; //羽枚数をゲット //r0 String instr7 = tf7.getText(); //テキストフィールド1よりStringをゲット r0 = labo.String2double(instr7); if(e.target instanceof Button) { String label = o.toString(); { if(label.equals("<<-")) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)+dtheta2*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)+dtheta2*Math.PI/180); } if(label.equals("->>")) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)-dtheta2*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)-dtheta2*Math.PI/180); } if(label.equals("LL")) { circle = true; cr=cr+1; //cw=cw+1; } if(label.equals("SS")) { circle = true; cr=cr-1; //cw=cw-1; } //微調整 if(label.equals("<-")) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)+dtheta1*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)+dtheta1*Math.PI/180); } if(label.equals("->")) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)-dtheta1*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)-dtheta1*Math.PI/180); } if(label.equals("L")) { circle = true; cr=cr+0.1; //cw=cw+1; } if(label.equals("S")) { circle = true; cr=cr-0.1; //cw=cw-1; } } // 各種計算 xp1=0; yp1=0; xp2=0; yp2=0.5*d2; xp3=-radius2*Math.sin(beta2*Math.PI/180); yp3=yp2-radius2*Math.cos(beta2*Math.PI/180); xp4=0.5*d1*Math.cos(0.5*Math.PI-th*Math.PI/180); yp4=0.5*d1*Math.sin(0.5*Math.PI-th*Math.PI/180); th1=270-beta1-th; xp5=xp4+radius2*Math.cos(th1*Math.PI/180); yp5=yp4+radius2*Math.sin(th1*Math.PI/180); xp6=0.5*(xp3+xp5); yp6=0.5*(yp3+yp5); a1=Math.tan(0.5*Math.PI-beta2*Math.PI/180); b1=0.5*d2; a2=-(xp5-xp3)/(yp5-yp3); b2=yp6-a2*xp6; xp7=(b2-b1)/(a1-a2); yp7=a2*xp7+b2; a3=(yp5-yp7)/(xp5-xp7); b3=yp7-a3*xp7; radius1=radius2+Math.sqrt(Math.pow((xp3-xp7),2)+Math.pow((yp3-yp7),2)); th2=labo.kakudo(xp5-xp7,yp5-yp7)*180/Math.PI; xp8=xp7+radius1*Math.cos(th2*Math.PI/180); yp8=yp7+radius1*Math.sin(th2*Math.PI/180); alpha1=(int)(Math.atan((yp8-yp7)/(xp8-xp7))*180/Math.PI); alpha2=(int)(Math.atan((yp2-yp7)/(xp2-xp7))*180/Math.PI); alpha11=(int)(Math.atan((yp4-yp5)/(xp4-xp5))*180/Math.PI); alpha22=(int)(Math.atan((yp8-yp5)/(xp8-xp5))*180/Math.PI); // グラフ表示 // String label = o.toString(); if(label.equals("")) { drawn = true; repaint(); // 結果表示 ta2.replaceRange("d1 = "+String.valueOf(d1)+"\n",0,500); ta2.append("d1 = "+String.valueOf(d2)+"\n"); ta2.append("beta1 = "+String.valueOf(beta1)+"\n"); ta2.append("beta2 = "+String.valueOf(beta2)+"\n"); ta2.append("Z = "+String.valueOf(m)+"\n"); ta2.append("th = "+String.valueOf(th)+"\n"); ta2.append("R1 = "+String.valueOf(radius1)+"\n"); ta2.append("R2 = "+String.valueOf(radius2)); } } repaint(); return true; } */ class MyListener implements ActionListener{ public void actionPerformed(ActionEvent e) { if((e.getSource()==btn1) || (e.getSource()==btn2) || (e.getSource()==btn3) || (e.getSource()==btn4) || (e.getSource()==btn5) || (e.getSource()==btn6) || (e.getSource()==btn7) || (e.getSource()==btn8) || (e.getSource()==btn9)) { // d1,d2,beta1,beta2の取得 String instr1 = tf1.getText(); //テキストフィールド1よりStringをゲット d1 = labo.String2double(instr1); String instr2 = tf2.getText(); //テキストフィールド2よりStringをゲット d2 = labo.String2double(instr2); String instr3 = tf3.getText(); //テキストフィールド3よりStringをゲット beta1 = labo.String2double(instr3); String instr4 = tf4.getText(); //テキストフィールド4よりStringをゲット beta2 = labo.String2double(instr4); String instr5 = tf5.getText(); //テキストフィールド5よりStringをゲット radius2 = labo.String2double(instr5); String instr6 = tf6.getText(); //テキストフィールド6よりStringをゲット th = labo.String2double(instr6); m=mychoice.getSelectedIndex()+6; //羽枚数をゲット //r0 String instr7 = tf7.getText(); //テキストフィールド1よりStringをゲット r0 = labo.String2double(instr7); { // String label = o.toString(); { if(e.getSource()==btn2) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)+dtheta2*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)+dtheta2*Math.PI/180); } if(e.getSource()==btn3) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)-dtheta2*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)-dtheta2*Math.PI/180); } if(e.getSource()==btn6) { circle = true; cr=cr+1; //cw=cw+1; } if(e.getSource()==btn7) { circle = true; cr=cr-1; //cw=cw-1; } //微調整 if(e.getSource()==btn4) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)+dtheta1*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)+dtheta1*Math.PI/180); } if(e.getSource()==btn5) { circle = true; cx=r0*Math.cos(labo.kakudo(cx,cy)-dtheta1*Math.PI/180); cy=r0*Math.sin(labo.kakudo(cx,cy)-dtheta1*Math.PI/180); } if(e.getSource()==btn8) { circle = true; cr=cr+0.1; //cw=cw+1; } if(e.getSource()==btn9) { circle = true; cr=cr-0.1; //cw=cw-1; } } // 各種計算 xp1=0; yp1=0; xp2=0; yp2=0.5*d2; xp3=-radius2*Math.sin(beta2*Math.PI/180); yp3=yp2-radius2*Math.cos(beta2*Math.PI/180); xp4=0.5*d1*Math.cos(0.5*Math.PI-th*Math.PI/180); yp4=0.5*d1*Math.sin(0.5*Math.PI-th*Math.PI/180); th1=270-beta1-th; xp5=xp4+radius2*Math.cos(th1*Math.PI/180); yp5=yp4+radius2*Math.sin(th1*Math.PI/180); xp6=0.5*(xp3+xp5); yp6=0.5*(yp3+yp5); a1=Math.tan(0.5*Math.PI-beta2*Math.PI/180); b1=0.5*d2; a2=-(xp5-xp3)/(yp5-yp3); b2=yp6-a2*xp6; xp7=(b2-b1)/(a1-a2); yp7=a2*xp7+b2; a3=(yp5-yp7)/(xp5-xp7); b3=yp7-a3*xp7; radius1=radius2+Math.sqrt(Math.pow((xp3-xp7),2)+Math.pow((yp3-yp7),2)); th2=labo.kakudo(xp5-xp7,yp5-yp7)*180/Math.PI; xp8=xp7+radius1*Math.cos(th2*Math.PI/180); yp8=yp7+radius1*Math.sin(th2*Math.PI/180); alpha1=(int)(Math.atan((yp8-yp7)/(xp8-xp7))*180/Math.PI); alpha2=(int)(Math.atan((yp2-yp7)/(xp2-xp7))*180/Math.PI); alpha11=(int)(Math.atan((yp4-yp5)/(xp4-xp5))*180/Math.PI); alpha22=(int)(Math.atan((yp8-yp5)/(xp8-xp5))*180/Math.PI); // グラフ表示 // String label = o.toString(); if(e.getSource()==btn9) { drawn = true; repaint(); // 結果表示 ta2.replaceRange("d1 = "+String.valueOf(d1)+"\n",0,500); ta2.append("d1 = "+String.valueOf(d2)+"\n"); ta2.append("beta1 = "+String.valueOf(beta1)+"\n"); ta2.append("beta2 = "+String.valueOf(beta2)+"\n"); ta2.append("Z = "+String.valueOf(m)+"\n"); ta2.append("th = "+String.valueOf(th)+"\n"); ta2.append("R1 = "+String.valueOf(radius1)+"\n"); ta2.append("R2 = "+String.valueOf(radius2)); } } repaint(); } } } }