
// <applet code = EinKoerper3dTP2 width = 400 height = 400></applet>

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

public class EinKoerper3dTP2 extends Applet {

  class Vektor {
    double x, y, z;

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

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

  class Massenpunkt {
    Vektor q, p;
    double m;

    Massenpunkt(double qx, double qy, double qz,
                double px, double py, double pz, double m) {
      q = new Vektor(qx, qy, qz);
      p = new Vektor(px, py, pz);
      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); }

  final double ax = 2.0, ay = 1.0, az = 4.0; // Federkonstanten

  Vektor Feder(Massenpunkt M) {
    return new Vektor(-ax * M.q.x, -ay * M.q.y, -az * M.q.z);
  }

  double Energie(Massenpunkt M) {
    return Math.pow(M.p.norm(), 2) / (2.0 * M.m) + 0.5 *
      (ax * M.q.x * M.q.x + ay * M.q.y * M.q.y + az * M.q.z * M.q.z); 
  }

  public void paint(Graphics g) {
    Massenpunkt M = new Massenpunkt(1.0, 0.0, 0.2, 0.5, 1.5, 0.2, 1.0);
    Vektor kraft, q_alt;
    double dt = 0.01, tmax = 10.0;
    double t_alt = 0.0, E, E_alt = Energie(M);

    setRange(0.0, tmax, 0.0, 4.0);
    g.setColor(Color.black);
    g.drawLine(0, 0, (int)tmax, 0);

    g.setColor(Color.blue);
    for(double t = 0.0; t <= tmax; t += dt) { 
      q_alt = new Vektor(M.q);
      kraft = Feder(M);
      M.euler(dt, kraft);
      E = Energie(M);
System.out.println(E);
      g.drawLine(sx(t_alt), sy(E_alt), sx(t), sy(E));
      t_alt = t; E_alt = E;

      try{ Thread.sleep(5); } catch(InterruptedException e) {};
    }
  } 

}


