
// <applet code = Rakete2dTP2 width = 800 height = 400></applet>

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.*;

public class Rakete2dTP2 extends Applet {

  class Vektor {
    double x, y;

    Vektor(double x, double y) { this.x = x; this.y = y; }
    Vektor(Vektor v) { x = v.x; y = v.y; }

    double norm() { return Math.sqrt(x * x + y * y); }
    void mal(double s) { x *= s; y *= s; }
    void plus(Vektor v) { x += v.x; y += v.y; }
    void plusvs(Vektor v, double s) { x += v.x * s; y += v.y * s; }
  }

  class Massenpunkt {
    Vektor q, p;
    double m;

    Massenpunkt(double qx, double qy, double px, double py, double m) {
      q = new Vektor(qx, qy);
      p = new Vektor(px, py);
      this.m = m;
    }

    void euler(double dt, Vektor kraft) {
      q.plusvs(p, dt / m);
      p.plusvs(kraft, dt);
    }
  }

  double xScale, yScale, xOffset, yOffset; 

  void setRange(double xMin, double xMax, double yMin, double yMax) { 
    xScale = getSize().width / (xMax - xMin); 
    yScale = -getSize().height / (yMax - yMin); 
    xOffset = -xMin * xScale; 
    yOffset = getSize().height - yMin * yScale; 
  }

  int sx(double x) { return (int)(x * xScale + xOffset); }
  int sy(double y) { return (int)(y * yScale + yOffset); }

  Vektor G() { return new Vektor(0.0, -9.81); }

  final double D = 0.5; // dm = -D * dt;
  final double vgr = 30.0; // vgr = | v_gas|rakete |

  Vektor Schub(Massenpunkt M) {
    Vektor v = new Vektor(
      vgr * M.p.x / M.p.norm(), vgr * M.p.y / M.p.norm()); // -v_gas|rakete
    v.mal(D); // schub = v_gas|rakete * D
    return v;
  }

  public void paint(Graphics g) {
    Massenpunkt M = new Massenpunkt(0.0, 0.0, 0.5, 5.0, 1.0);
    Vektor kraft, q_alt;
    double tmax = 5.0, dt = 0.001;
    double m_nutz = M.m * 0.1;

    setRange(0.0, 400.0, -20.0, 180.0);
    g.setColor(Color.black);
    g.drawLine(sx(0.0), sy(0.0), sx(400.0), sy(0.0));

    g.setColor(Color.blue);
    for(double t = 0.0; t <= tmax; t += dt) { 
      q_alt = new Vektor(M.q);
      kraft = G();
      if(M.m > m_nutz) kraft.plus(Schub(M)); // so lange wenn Treibstoff gibt
      M.euler(dt, kraft);
      if(M.m > m_nutz) M.m += -D * dt; // dm = -D * dt
      if(M.q.y < 0.0) break;

      if(M.m > m_nutz) g.setColor(Color.red); else g.setColor(Color.blue); 
      g.drawLine(sx(q_alt.x), sy(q_alt.y), sx(M.q.x), sy(M.q.y));
      
      try{ Thread.sleep(5); } catch(InterruptedException e) {};
    }
    g.setColor(Color.yellow);
    g.fillOval(sx(M.q.x) - 5, sy(M.q.y) - 5, 10, 10);
System.out.println("x = " + M.q.x);
  } 

}



