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

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

public class DreiKoerper2dTP2 extends Applet {

  final int N = 3;

  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 Feder(Massenpunkt M[], int n) {
    final double ax = 1.0, ay = 1.0; // Federkonstanten

    Vektor kraft = new Vektor(0.0, 0.0);
    for(int i = 0; i < N; i++) {
      if(i != n) {
        kraft.x += -ax * (M[n].q.x - M[i].q.x);
        kraft.y += -ay * (M[n].q.y - M[i].q.y);
      }
    }
    return kraft;
  }

  public void paint(Graphics g) {
    Massenpunkt M[] = new Massenpunkt[N];
    Color Farbe[] = new Color[N];
    Vektor kraft[] = new Vektor[N], q_alt[] = new Vektor[N];
    double tmax = 15.0, dt = 0.01;

    M[0] = new Massenpunkt(-1.0, 0.0, 0.0, -0.1, 1.0); Farbe[0] = Color.blue;
    M[1] = new Massenpunkt(1.0, 0.0, 0.0, 0.1, 4.0); Farbe[1] = Color.red;
    M[2] = new Massenpunkt(0.0, 1.0, 0.0, 0.0, 9.0); Farbe[2] = Color.green;

    setRange(-2.0, 2.0, -2.0, 2.0);

    for(double t = 0.0; t <= tmax; t += dt) 
	{ 
	    for(int i = 0; i < N; i++) 
		{
		    q_alt[i] = new Vektor(M[i].q); 
		    kraft[i] = Feder(M, i); 
		}
	    for(int i = 0; i < N; i++) 
		{
		    M[i].euler(dt, kraft[i]); 
		    g.setColor(Farbe[i]);
		    g.drawLine(sx(q_alt[i].x), sy(q_alt[i].y), sx(M[i].q.x), sy(M[i].q.y));
		}

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

}




