import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;


public class appl_kaffee extends Applet implements ActionListener {


		public Label ergebnis;	

		public TextField t_hoehe;
		public TextField t_br_oben;
		public TextField t_br_unten;
		public TextField t_mas_tasse;
		public TextField t_fuellgrad;
		public Button start;

		double g = 9.81; // in m/s^2
		double dichte = 0.95; // in g/dm^3
		boolean zylinder = false;
		double cw = 1.33;

	public void paint(Graphics g) {

		
		g.drawString("Zur Berechnung werden die Angaben in den jeweils ange-", 10, 15); 
		g.drawString("gebenen Dimensionen benötigt. Der Füllgrad richtet sich nach", 10, 35); 
		g.drawString("der Höhe, nicht nach dem Volumen des Inhalts.", 10, 55);
		g.drawString("Höhe der Tasse", 10, 95);
		g.drawString("Oberer Durchmesser", 10, 120);
		g.drawString("Unterer Durchmesser", 10, 145);
		g.drawString("Eigenmasse der Tasse", 10, 170);
		g.drawString("Füllgrad", 10, 195);

		g.drawString("[cm]", 300, 95);
		g.drawString("[cm]", 300, 120);
		g.drawString("[cm]", 300, 145);
		g.drawString("[g]", 300, 170);
		g.drawString("[%]", 300, 195);
		
		g.drawString("Eventuelle Kommata bitte durch einen Punkt ersetzen.", 10, 230);
	}


	public void actionPerformed(ActionEvent e) {
		
		if (e.getSource() == start) {
		ergebnis.setText("");
		
		Double hoehe_m = Double.valueOf(t_hoehe.getText());
		Double br_oben_m = Double.valueOf(t_br_oben.getText());
		Double br_unten_m = Double.valueOf(t_br_unten.getText());
		Double mas_tasse_m = (Double.valueOf(t_mas_tasse.getText())/1000);
		int fuellgrad_m = Integer.valueOf(t_fuellgrad.getText());

		double m_m = f_steigung(hoehe_m, br_oben_m, br_unten_m);

		double volumen_m = f_volumen_kaffee(hoehe_m, br_oben_m, br_unten_m, fuellgrad_m, f_steigung(hoehe_m, br_oben_m, br_unten_m), f_achsenabschnitt(br_unten_m));

		double masse_kaf_m = f_masse_kaffee(f_volumen_kaffee(hoehe_m, br_oben_m, br_unten_m, fuellgrad_m, m_m, f_achsenabschnitt(br_unten_m)));

		double windkraft_m = f_normalkraft(mas_tasse_m, masse_kaf_m) * 0.3;

		double flaeche_m = f_flaeche(hoehe_m, br_oben_m, br_unten_m);

		double geschw = Math.sqrt( (2 * windkraft_m) / (1.2041 * 1.33 * flaeche_m) );

		DecimalFormat f = new DecimalFormat("#0.00");

		if (hoehe_m > 0 && br_oben_m > 0 && br_unten_m > 0 && mas_tasse_m >= 0 && fuellgrad_m > 0 && fuellgrad_m <= 100) { 
		
			ergebnis.setText("Maximale Windgeschwindigkeit: " + String.valueOf(f.format(geschw)) + " m/s");
		}

		else {
			ergebnis.setText("Die eingegebenen Werte sind merkwürdig");
		}
		}

	}

	double f_steigung(double hoehe, double br_oben, double br_unten) {
	//Berechnet die Steigung eines um die x-Achse gelegten Bechers, falls es sich nicht um einen Zylinder handelt
		
		double steigung;

			if ((br_oben - br_unten) == 0) {

				steigung = 0;

				zylinder = true;
			}

			else {

				steigung = ((br_oben - br_unten) / 2) / hoehe;

			}

		return steigung;
	}

	double f_achsenabschnitt(double br_unten) {
	//Gibt den Achsenabschnitt der Gerade aus
		
		double achsenabschnitt = br_unten / 2 ;

	return achsenabschnitt;

	}

	double f_volumen_kaffee(double hoehe, double br_oben, double br_unten, int fuellgrad, double m, double b) {
	//Berechnet das Rotationsvolumen eines Bechers in Abhängigkeit seines Füllgrades
		double volumen_kaffee;
		
			if (zylinder == true) {

				volumen_kaffee = (Math.PI * Math.pow((br_oben / 2), 2) * ((hoehe * fuellgrad) / 100) / Math.pow(10,3));

			}

			else {

				double volumen_kaffee_1 = (Math.pow(m, 2) * Math.pow((hoehe * fuellgrad) / 100, 3) / 3 );	

				double volumen_kaffee_2 = (2 * (br_unten / 2) * m * Math.pow((hoehe * fuellgrad) / 100, 2) / 2 );
					
				double volumen_kaffee_3 = Math.pow(br_unten / 2,  2) * (hoehe * fuellgrad) / 100 ;
					
				volumen_kaffee = (Math.PI * (volumen_kaffee_1 + volumen_kaffee_2 + volumen_kaffee_3) / Math.pow(10, 3));
			}

		volumen_kaffee = volumen_kaffee / Math.pow(10, 3);

		return volumen_kaffee;
	}

	double f_masse_kaffee(double volumen) {
	//Anhand der Dichte von Kaffee berechet die Funktion die Masse des im Becher enthaltenen Kaffees (in kg)

			double masse_kaffee = volumen * dichte;
		
		return masse_kaffee;
	}

	double f_normalkraft(double masse_tas, double masse_kaf) {
	//Berechnung der Gewichtskraft aus der Summe von Tassengewicht + Kaffeegewicht (in N)

			double normalkraft = ((masse_tas / Math.pow(10, 3))  + masse_kaf ) * g; 

		return normalkraft;
	}

	double f_flaeche(double hoehe, double br_oben, double br_unten) {
	// Gibt die Windangriffsfläche aus (in m^2)

		double flaeche;
		
		if (br_oben == br_unten) {

			flaeche = (br_oben * hoehe) / Math.pow(10, 4);
			
			return flaeche;
		}

		else {
			
			flaeche = (((br_oben + br_unten) / 2) * hoehe) / Math.pow(10, 4);

			return flaeche;
		}

	}


	public void init() {

		t_hoehe = new TextField("");
		t_hoehe.setSize(30, 20);
		t_hoehe.setLocation(260, 80);
		t_br_oben = new TextField("");
		t_br_oben.setSize(30, 20);
		t_br_oben.setLocation(260, 105);
		t_br_unten = new TextField("");
		t_br_unten.setSize(30, 20);
		t_br_unten.setLocation(260, 130);
		t_mas_tasse = new TextField("");
		t_mas_tasse.setSize(30, 20);
		t_mas_tasse.setLocation(260, 155);
		t_fuellgrad = new TextField("");
		t_fuellgrad.setSize(30, 20);
		t_fuellgrad.setLocation(260, 180);

		start = new Button("Rechnen");
		start.setSize(80, 30);
		start.setLocation(10, 265);
		start.addActionListener(this);

		ergebnis = new Label("");
		ergebnis.setSize(300, 30);
		ergebnis.setLocation(130, 265);
		

		setLayout(null);

		add(t_hoehe);
		add(t_br_oben);		
		add(t_br_unten);
		add(t_mas_tasse);
		add(t_fuellgrad);

		add(start);
		add(ergebnis);

	}

	public static void main(String[] args) {
		appl_kaffee a = new appl_kaffee();
		a.init();
	}
}



