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

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

public class Planeten2dTP2 extends Applet {

  final int N = 2;

  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 Gravitation(Massenpunkt M[], int n) {
    final double G = 0.03; // Gravitationskonstante

    Vektor kraft = new Vektor(0.0, 0.0);
    for(int i = 0; i < N; i++) {
      if(i != n) {
        Vektor d = new Vektor(M[n].q.x - M[i].q.x, M[n].q.y - M[i].q.y);
        kraft.plusvs(d, -G * M[n].m * M[i].m / Math.pow(d.norm(), 3));
        kraft.plusvs(d, -0.01 * G * M[n].m * M[i].m / Math.pow(d.norm(),5));
      }
    }
    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 = 100.0, dt = 0.0001;

    M[0] = new Massenpunkt(-1.5, 0.0, 0.0, -0.2, 1.0); Farbe[0] = Color.blue;
    M[1] = new Massenpunkt(0.8, 0.0, 0.0, 0.2, 10.0); Farbe[1] = Color.red;

    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] = Gravitation(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(1); } catch(InterruptedException e) {};
    }
  } 
}




