import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.Math.*;
import javax.swing.*;
import javax.swing.event.*;

public class touka extends AnimeApplet
{
    JScrollBar sbKabe;
    JCheckBox cbI,cbP,cbR,cbG;

    public void resetAll() {
        setKabe(0.0);
    }

    public void init() {
        super.init();
        setStepTime(0.2);

        Container cont=getContentPane();
        cont.setLayout(new BorderLayout());

        sbKabe=new JScrollBar(JScrollBar.HORIZONTAL);
        sbKabe.setMaximum(100);
        sbKabe.setMinimum(0);
        sbKabe.setValue(50);

        resetAll();

        sbKabe.addAdjustmentListener(new java.awt.event.AdjustmentListener() {
            public void adjustmentValueChanged(java.awt.event.AdjustmentEvent evt) {
                setKabe(((double)sbKabe.getValue())/25.0-2.0);
            }
        });


        JPanel p=new JPanel();
        p.setLayout( new GridLayout(3,1));
        p.add(animePanel);

        cbI=new JCheckBox("入射波を見せる",false);

        cbI.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                ChangeShowInFlg(cbI.isSelected());
            }
        });

        cbG=new JCheckBox("合成波を見せる",true);

        cbG.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                ChangeShowGoseiFlg(cbG.isSelected());
            }
        });

        cbP=new JCheckBox("透過波を見せる",true);

        cbP.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                ChangeShowPFlg(cbP.isSelected());
            }
        });
        cbR=new JCheckBox("反射波を見せる",false);

        cbR.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                ChangeShowRFlg(cbR.isSelected());
            }
        });

        JPanel p1=new JPanel();
        p1.setLayout(new BorderLayout());
        Panel p2=new Panel();
        p2.setLayout(new BorderLayout());
        Panel p3=new Panel();
        p3.setLayout(new BorderLayout());
        Panel p4=new Panel();
        p4.setLayout(new BorderLayout());

        Label l1=new Label("ポテンシャルの高さ");

        p1.add(l1,BorderLayout.WEST);
        p1.add(sbKabe,BorderLayout.CENTER);
        p.add(p1);
        Panel p5=new Panel();
        p5.add(cbI);
        p5.add(cbG);
        p5.add(cbP);
        p5.add(cbR);
        p.add(p5);

        cont.add("South",p);
        cont.add("Center",canvas);

        tm.start();
        start();
    }

    boolean ShowGoseiFlg=true;
    boolean ShowInFlg=false;
    boolean ShowPFlg=true;
    boolean ShowRFlg=false;
    double kabe;
    double k=4;

    public void setKabe(double a) {
        kabe=a;
        Graphics g=getGraphics();
        if( g != null ) { update(g); }
    }

    public void ChangeShowGoseiFlg(boolean a) {
        ShowGoseiFlg=a;
        Graphics g=getGraphics();
        if( g != null ) { update(g); }
    }

    public void ChangeShowInFlg(boolean a) {
        ShowInFlg=a;
        Graphics g=getGraphics();
        if( g != null ) { update(g); }
    }

    public void ChangeShowPFlg(boolean a) {
        ShowPFlg=a;
        Graphics g=getGraphics();
        if( g != null ) { update(g); }
    }
    public void ChangeShowRFlg(boolean a) {
        ShowRFlg=a;
        Graphics g=getGraphics();
        if( g != null ) { update(g); }
    }
    private void writeSegment(Graphics g,int i,int y, int ny) {
        if( ny> y) {
            g.fillRect(i,y,1,ny-y);
        } else {
            if( ny==y ) {
                g.fillRect(i,y,1,1);
            } else {
                g.fillRect(i,ny,1,y-ny);
            }
        }
    }

    public void writeCanvas(Graphics g) {
        int i;
        double x;
        double nx;
        double y1,y2,y3,y4,ny1,ny2,ny3,ny4;
        int w,h;

        double R,P,phi;

        w=canvas.getWidth();
        h=canvas.getHeight();

        g.setColor(Color.white);
        g.fillRect(0,0,w,h);

        g.setColor(Color.gray);
        g.drawLine(0,h/2,w,h/2);
        g.drawLine(w/2,h,w/2,-h);


        double E=k*k-40*kabe;
        double kdash;

        if( E>=0 ) {
            kdash=Math.sqrt(E);
            R=(k-kdash)/(kdash+k);
            P=2*k/(kdash+k);
            phi=0;
        } else {
            kdash=Math.sqrt(-E);
            double kk=Math.sqrt(kdash*kdash+k*k);

            R=1.0;
            P=2*k/kk;
            phi=Math.acos(kdash/kk)-Math.PI/2;
        }


        for( i=0 ; i<w/2 ; i++ ) {
            x= 2*i*Math.PI/w-Math.PI;
            nx=2*(i+1)*Math.PI/w-Math.PI;

            double kx=k*x;
            double knx=k*nx;

            y1=Math.sin(kx-t);
            ny1=Math.sin(knx-t);


            y2=R*Math.sin(-kx-t+2*phi);
            ny2=R*Math.sin(-knx-t+2*phi);


            if( ShowInFlg ) {
                g.setColor(Color.red);
                writeSegment(g,i,(int)(y1*h/5)+h/2,(int)(ny1*h/5)+h/2);
            }
            if( ShowRFlg ) {
                g.setColor(Color.blue);
                writeSegment(g,i,(int)(y2*h/5)+h/2,(int)(ny2*h/5)+h/2);
            }
            if( ShowGoseiFlg ) {
                g.setColor(Color.black);
                writeSegment(g,i,(int)((y1+y2)*h/5)+h/2,
                             (int)((ny1+ny2)*h/5)+h/2);
            }
        }
        if( ShowPFlg ) {
            for( i=w/2 ; i<w ; i++ ) {
                x= 2*i*Math.PI/w-Math.PI;
                nx=2*(i+1)*Math.PI/w-Math.PI;

                double kdashx=kdash*x;
                double kdashnx=kdash*nx;

                if( E>=0 ) {
                    y3=P*Math.sin(kdashx-t);
                    ny3=P*Math.sin(kdashnx-t);
                } else {
                    double tphi= -t+phi;
                    y3=P*Math.exp(-kdashx)*Math.sin(tphi);
                    ny3=P*Math.exp(-kdashnx)*Math.sin(tphi);
                }

                g.setColor(new Color(0,130,0));
                writeSegment(g,i,(int)(y3*h/5)+h/2,(int)(ny3*h/5)+h/2);
            }
        }
    }
}






//  LocalWords:  touka
