import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Scrollbar;
import java.awt.TextField;
import java.awt.event.*;
import java.awt.geom.Line2D;


import javax.swing.*;



/*class Schwingung
{


public Schwingung()
{


}
	double Getmax(double mxAr[][])
	{
		int Grenze = mxAr.length;
		double maxWert = 0;
		for (int q = 0; q < Grenze; q++)
		{
			if (maxWert < Math.abs(mxAr[q][1]))
				maxWert = Math.abs(mxAr[q][1]);
		}
		return maxWert;
		
	}
	void Runge_Kutta(double x, double y , double dy, double h, double w, double D)
		{
			double F = 0;
			double z;
			double Runge[][] = new double[6][5];
			Runge[0][0] =  x;
			Runge[1][0] = y;
			Runge[2][0] = dy;
			
			for (int n = 0; n< 4; n++)
			{
				z = 2;
				if (n == 2)
					z = 1;
				
				Runge[3][n] = (double) -2*D*w*Runge[2][n]-w*Runge[1][n]-F;
				Runge[4][n] = (double) h*Runge[2][n];
				Runge[5][n] = (double) h*Runge[3][n];
				Runge[2][n+1] = (double) Runge[2][0] + Runge[5][n]/z;
				
				Runge[0][n+1] = (double) Runge[0][0]+ h/z;
				Runge[1][n+1] = (double) Runge[1][0]+ Runge[4][n]/z;
				
			}
			nx = (double) Runge[0][0]+h;
			ny = (double) 1/6 * (Runge[4][0]+Runge[4][1]+Runge[4][2]+Runge[4][3]) + y;
			ndy = (double)1/6 * (Runge[5][0]+Runge[5][1]+Runge[5][2]+Runge[5][3]) + dy;
			//System.out.println(ny);
		}
	double nx, ny, ndy;

}*/

class Window extends JFrame
{
	int Frequenz =1;
	double Betrachtw = 70 ;

	double Feinheit = 0.01;
	double daempf = 0;
	double masse = 1;
	double federc = 1;
	int Punkte = new Double(Betrachtw/Feinheit).intValue();
	
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	Scrollbar sb_Daempf, sb_Phase, sb_Masse, sb_Federc;
	JTextField tx_Masse, tx_Federc, tx_Frequenz;

	int Wert;
	static int Radius;


	public Window()
	{
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(200, 100, 800, 600);
	contentPane = new JPanel();
	setContentPane(contentPane);
	contentPane.setLayout(null);
	

	class Panel extends JPanel {

	    double ergebnis[][] = new double[Punkte][3];


	    public void paintComponent(Graphics g)
	    {

	    	
	    	Graphics2D g2 = (Graphics2D)g;
	        ergebnis[0][0]= 0;
	        ergebnis[0][1]= 10;
	        ergebnis[0][2]= 0;
	        double eigenfreq;
	        eigenfreq = federc/masse;
	        //super.paintComponent(g2);
	        double xskal = Punkte/getWidth();
	        int ym = getHeight()/2;
	        int xm = getWidth();
	        g2.setColor(new Color(255,255,255));
	        //g2.fillRect(0, 0, getWidth()-1, getHeight()-1);
	        Schwingung schwing = new Schwingung();
	        //Koordinatensystem
	        g2.setColor(new Color(55,55,55));
	        g2.drawLine(xm/90, 0, xm/90, ym*2);
	        g2.drawLine(0, ym, xm, ym);
	        g2.translate(xm/90, 0);
	        
	        g2.setColor(new Color(0,0,255));
	         for (int n = 0; n < Punkte-1; n++)
  	        {
	        	
  	        	schwing.Runge_Kutta(ergebnis[n][0],  ergebnis[n][1], ergebnis[n][2], Feinheit , eigenfreq, daempf);
  	            ergebnis[n+1][0]= (double) schwing.nx;
  	        	ergebnis[n+1][1]= (double) schwing.ny;
  	        	ergebnis[n+1][2]= (double) schwing.ndy;
  	        	//System.out.println(ergebnis[n][1]);

  	        }
	         double yskal = 0.4*getHeight()/schwing.Getmax(ergebnis);
	  	     for (int z = 0; z < Punkte-1; z++)
		        {
		        	g2.draw(new Line2D.Double( ergebnis[z][0]*xskal , ergebnis[z][1]*yskal+ym ,  ergebnis[z+1][0]*xskal,  ergebnis[z+1][1]*yskal+ym));
		        }


	   }
	    public void update(Graphics g)
	    {
	    	paintComponent(g);
	    }
	   

	    

	}
	
	Panel panel = new Panel();
	panel.setBackground(new Color(1, 5, 245));
	panel.setBounds(100, 10, 600, 440);
	contentPane.add(panel);
	
	JLabel l_Daempf = new JLabel("Daempfung");
	l_Daempf.setBounds(8, 280, 120, 14);
	contentPane.add(l_Daempf);
	
	JLabel l_Masse = new JLabel("Masse");
	l_Masse.setBounds(8, 470, 120, 14);
	contentPane.add(l_Masse);
	
	JLabel l_Federc = new JLabel("Federkonstante");
	l_Federc.setBounds(8, 520, 120, 14);
	contentPane.add(l_Federc);
	
	tx_Masse = new JTextField();
	tx_Masse.setBounds(265, 490, 86, 20);
	tx_Masse.setText(String.valueOf(masse));
	getContentPane().add(tx_Masse);
	tx_Masse.setColumns(10);
	
	tx_Federc = new JTextField();
	tx_Federc.setBounds(265, 540, 86, 20);
	tx_Federc.setText(String.valueOf(federc));
	getContentPane().add(tx_Federc);
	tx_Federc.setColumns(10);
	
	
	sb_Daempf = new Scrollbar(Scrollbar.VERTICAL, 0,1,0,100);
	sb_Daempf.setBounds(23, 40, 17, 231);
	sb_Daempf.setValue(0);
	contentPane.add(sb_Daempf);
	class WertChange implements AdjustmentListener{
		    public void adjustmentValueChanged(AdjustmentEvent ae){
		    daempf = (double) sb_Daempf.getValue()/100;
		    repaint();
		      
		    }
		  }
	sb_Daempf.addAdjustmentListener(new WertChange());
	
	sb_Masse = new Scrollbar(Scrollbar.HORIZONTAL, 0,1,1,100);
	sb_Masse.setBounds(12, 490, 230, 17);
	sb_Masse.setValue(50);
	contentPane.add(sb_Masse);
	class MassChange implements AdjustmentListener{
		    public void adjustmentValueChanged(AdjustmentEvent ae){
		    masse = (double) sb_Masse.getValue()/50;
		    repaint();
			tx_Masse.setText(String.valueOf(masse)); 
		    }
		  }
	sb_Masse.addAdjustmentListener(new MassChange());
	
	sb_Federc = new Scrollbar(Scrollbar.HORIZONTAL, 0,1,1,100);
	sb_Federc.setBounds(12, 540, 230, 17);
	sb_Federc.setValue(50);
	contentPane.add(sb_Federc);
	class FcChange implements AdjustmentListener{
		    public void adjustmentValueChanged(AdjustmentEvent ae){
		    federc = (double) sb_Federc.getValue()/50;
		    repaint();
			tx_Federc.setText(String.valueOf(federc)); 
		    }
		  }
	sb_Federc.addAdjustmentListener(new FcChange());
	
	sb_Phase = new Scrollbar(Scrollbar.VERTICAL, 0,1,1,90);
	sb_Phase.setBounds(59, 40, 17, 231);
	sb_Daempf.setValue(1);
	contentPane.add(sb_Phase);
	class PChange implements AdjustmentListener{
		    public void adjustmentValueChanged(AdjustmentEvent ae){
			Frequenz = sb_Phase.getValue();
			repaint();
		      
		    }
		  }
	sb_Phase.addAdjustmentListener(new PChange());

	}
}
public class Cl_Schwingung {
	public static void main( String[] args)
	{
		Window fenster = new Window();
		fenster.show();


	}
}
