/* Matura21.java */
import java.awt.event.*;
import java.applet.*;
import java.awt.*;
import java.util.Random;
public class Matura21
extends Applet
implements ActionListener, AdjustmentListener
{
// hier werden alle Elemente der Formel und der Datei selber definiert
int height = 540; // Fenstergrösse ( aus der HTML-Datei)
int width = 800;
int ground = height - 100; //Der Boden
int xstart = 45; // Startwerte
int ystart = ground; //normales Koordinatensystem nicht das welches für Java gewöhnlich ist
int xkreis = 40;
int ykreis = 435;
double v = 14.5; // Geschwindigkeit
double winkel = 45; // Standartwinkel
double t = 0.01; // Zeitschritt (Genauigkeit der Darstellung)
int zz = 10;
int faktor = 15; // 1 Meter entspricht [faktor] Pixel
int versuch = 1;
int xziel = 600;
int yziel = 300;
int abstand = 0;
int s = 581;
int u = 650;
double cw = 0.000286;
int höhe = 0;
double beta1 = 0.030114; //Widerstandswert
double beta = 0;
double masse1 = 1; //Masse des Fussballs
double masse = 0;
int maxabstand = 0; //Ausrechnen der Maxweite
int maxwinkel = 0;
//Globale Variablen für grafische Elemente
Graphics g; // Klasse für das Grafische
Button knopf = new Button("Start"); //Knopf für den Schuss
Button bt_reset = new Button("Reset");
Label daten = new Label();
Label lb_v = new Label("Geschwindigkeit in [m/s]"); // Anzeige für die Geschwindigkeit
Label lb_winkel = new Label("Winkel in Grad [°]");
Label lb_masse = new Label("Masse in [kg]");
Label lb_cw = new Label("CW-Wert");
Scrollbar scrollwinkel=new Scrollbar(Scrollbar.HORIZONTAL,(int)winkel,20,0,110); //für den Winkel zum scrollen
Scrollbar scrollv=new Scrollbar(Scrollbar.HORIZONTAL,(int)v,20,0,45);
Scrollbar scrollmasse1=new Scrollbar(Scrollbar.HORIZONTAL,(int)masse1,20,0,40);
Scrollbar scrollcw = new Scrollbar(Scrollbar.HORIZONTAL,(int)cw,20,0,30);
Checkbox widerstand = new Checkbox("Luftwiderstand",true); //Widerstand , eine Box in der man einen Haken hinterlässt und die so aktiviert wird
CheckboxGroup body = new CheckboxGroup();
//Eigentliche Parabelfunktion
public void draw(Graphics g){
double fx, fy;
double fallbeschl = 9.81; //Fallbeschleunigung
double xold, yold;
double x, y, vx, vy, ax, ay;
double beta1, va ;
va = v;
beta1 = beta1 = ((masse1*cw)/2)*Math.pow(v,2);
vx = v * Math.cos(winkel/180*Math.PI); // x-Abschnitt der Parabel
vy = -v * Math.sin(winkel/180*Math.PI); // y-Abschnitt der Parabel
x = xstart; // in welchen Punkten es starten soll
y = ystart;
int farbe = 0;
do{ //der Befehl do{} lässt die Parabel erscheinen , aber ohne Knopfdruck läuft nix ... siehe weiter unten!
beta1 = ((masse1*cw)/2)*Math.pow(v,2);
xold = x;
yold = y;
fx = -beta*(Math.sqrt(vx*vx+vy*vy)*vx); //neue Kraft in x-Richtung (inkl. Luftwiderstand)
fy = beta*(Math.sqrt(vx*vx+vy*vy)*vy)-masse1*fallbeschl; //neue Kraft in y-Richtung
ax = fx/masse1; //neue x-Beschl.
ay = fy/masse1; //neue y-Beschl.
vx = vx + ax*t; //neue x-Geschw.
vy = vy - ay*t; //neue y-Geschw.
x = x + vx * t; //neue x-Koordinate
y = y + vy * t; //neue y-Koordinate
höhe = (int)(Math.pow(v,2) * Math.pow(Math.sin(winkel/180*Math.PI),2)/(2*fallbeschl)*faktor);
if (farbe==0){ g.setColor(Color.green); farbe = 1;} //Farbwechsel
else{ g.setColor(Color.yellow); farbe = 0;}
g.drawLine((int) Math.round((xold - xstart)*faktor + xstart),
(int) Math.round((yold - ystart)*faktor + ystart),
(int) Math.round((x - xstart)*faktor + xstart),
(int) Math.round((y - ystart)*faktor + ystart));
g.drawOval((int)Math.round((xold - xstart)*faktor + xstart),
(int)Math.round((yold - ystart)*faktor +ystart),10,10);
try{
Thread pause = new Thread();
pause.sleep(zz);
}catch(InterruptedException e) {}
}while ( (y - ystart)*faktor + ystart <= ystart);
abstand = (int)((x - xstart)*faktor);
update();
if(abstand==s){ //Benutzer hat Tor getroffen
lb_v.setText("Geschwindigkeit in [m/s]");
}
}
//Initialisierungsfunktion wird beim Applet-Start aufgerufen
public void init(){ // für das Applet : Hintergrundfarbe, wo es Bilder herholen soll, die eigentlichen Scrolls(also ihre Koordinaten) usw.
setLayout(null);
setSize(width, height);
setBackground( new Color(102,204,255));
daten.setBounds(70,ground + 10,700, 20);
lb_winkel.setBounds(200,ground + 70,150, 20);
lb_v.setBounds(200,ground + 40,200,20);
lb_masse.setBounds(500,ground +40,150,20);
lb_cw.setBounds(500,ground + 70,150,20);
knopf.setBounds(50,10,120,25); // Positionen und Grössen der Elemente
bt_reset.setBounds(180,10,100,25);
scrollwinkel.setBounds(70,ground + 70,120,20);
scrollv.setBounds(70,ground + 40,120,20);
scrollmasse1.setBounds(370,ground +40,120,20);
scrollcw.setBounds(370,ground +70,120,20);
widerstand.setBounds(570,ground + 70,120,20);
g = getGraphics();
add(daten);
add(scrollwinkel);
add(scrollv); //zeichne Elemente
add(scrollmasse1);
add(scrollcw);
add(knopf);
add(bt_reset);
add(widerstand);
add(lb_winkel);
add(lb_v);
add(lb_masse);
add(lb_cw);
knopf.addActionListener(this); // zu überwachende Elemente
bt_reset.addActionListener(this);
scrollwinkel.addAdjustmentListener(this);
scrollv.addAdjustmentListener(this);
scrollmasse1.addAdjustmentListener(this);
scrollcw.addAdjustmentListener(this);
update();
}
//Überwacht die Buttons auf Clicks
public void actionPerformed( ActionEvent e){
if (widerstand.getState()){ // Widerstand ausschalten, wenn gewünscht
beta = beta1;} else if(!widerstand.getState()){
beta = 0;
}
if(e.getSource()==knopf){
versuch++;
draw(g);
}
if(e.getSource()==bt_reset){
reset();
}
}
//Überwacht die Scrollbars auf Änderungen
public void adjustmentValueChanged(AdjustmentEvent e){ //für das Bewegen der Scrolls wichtig, damit sich die Werte verändern können
winkel = scrollwinkel.getValue();
v = scrollv.getValue();
masse1 = scrollmasse1.getValue();
cw = scrollcw.getValue();
update();
}
//Zeichnungsfunktion: Wird immer wieder aufgerufen
public void paint(Graphics g){
g.setColor(Color.black);
g.drawLine(0,ground,width,ground);
g.setColor(Color.gray);// Farben des Koordinatensystem
g.drawLine(0,ystart,width,ystart); // Koordinatenachsen zeichnen
g.drawLine(xstart,0,xstart,height-10);
}
//reset - dazu brauchts keinen Kommentar;
public void reset()
{
abstand = 0;
update();
g.clearRect(0,0,width,height);
paint(g);
lb_v.setText("Weite = ? Winkel = ?");
}
//update - aktualisiert die Daten
public void update()
{
daten.setText ( " Winkel: " + (int)winkel + "°" +
" v: " + (int)v + " m/s" +
" vx: " + Math.round( v * Math.cos(winkel/180*Math.PI)) + " m/s" +
" vy: " + Math.round( v * Math.sin(winkel/180*Math.PI)) + " m/s" +
" Masse: " + (int)masse1 + "kg" +
" CW-Wert:" + (int)cw +
" Distanz: " + abstand + "m" + " " +
" Höhe: " + höhe + "m" );
}
}