static final boolean JAVA = 1/2 != 1/2.;
static final int FONT_SIZE = 18;
static final String FONT_JAVA = "DejaVu Sans Mono";
static final String FONT = JAVA? FONT_JAVA : "monospace";
static final String LF = "\n", COMMA = ", ", M = "M";
static final String FC = "Frame: ", FR = " - FPS: ";
static final String MASS = " Mass: ";
static final String POS = "Position: ";
static final String VEL = "Velocity (x10000): ";
static final color BG = 0350, FG = 0100;
static final color C1 = #0000FF, C2 = #FF0000;
static final float BOLD = 3.5;
static final int W = 900, H = 650, FPS = 60, SMOOTH = 3;
static final int DIAM1 = 20, DIAM2 = 45, OFFSET = 50;
static final float G = 6.67408e-5;
static final float T = .5, TT = T * T, SPD = 1e4;
static final float M1 = 1e3, GM1 = G*M1, TGM1 = T*GM1;
static final float TTGM1 = TT*GM1, TTG3M1 = 3*TTGM1;
static final float X1 = W>>2, Y1 = H>>2;
static final float VX1 = 1.3, VY1 = -.6;
static final float M2 = 9e6, GM2 = G*M2, TGM2 = T*GM2;
static final float TTGM2 = TT*GM2, TTG3M2 = 3*TTGM2;
static final float X2 = W>>1, Y2 = H>>1;
static final float VX2 = 0, VY2 = 0;
float vx1, vy1, vx2, vy2;
size(W, H, JAVA? FX2D : JAVA2D);
if (width != W) settings();
textAlign(LEFT, BASELINE);
textFont(createFont(FONT, FONT_SIZE, true));
final float rx1 = x2 - x1, ry1 = y2 - y1;
final float rx2 = x1 - x2, ry2 = y1 - y2;
final float r1 = mag(rx1, ry1), r2 = mag(rx2, ry2);
final float r13 = r1*r1*r1, r14 = r13*r1;
final float r23 = r2*r2*r2, r24 = r23*r2;
final float rx1r13 = rx1/r13, ry1r13 = ry1/r13;
final float rx2r23 = rx2/r23, ry2r23 = ry2/r23;
vx1 += TGM2*rx1r13 - TTG3M2*rx1/r14;
vy1 += TGM2*ry1r13 - TTG3M2*ry1/r14;
vx2 += TGM1*rx2r23 - TTG3M1*rx2/r24;
vy2 += TGM1*ry2r23 - TTG3M1*ry2/r24;
x1 += T*vx1 + TTGM2*rx1r13;
y1 += T*vy1 + TTGM2*ry1r13;
x2 += T*vx2 + TTGM1*rx2r23;
y2 += T*vy2 + TTGM1*ry2r23;
ellipse(x1, y1, DIAM1, DIAM1);
ellipse(x2, y2, DIAM2, DIAM2);
hud(1, OFFSET, OFFSET, M1, x1, y1, vx1, vy1);
hud(2, width/2 + OFFSET, OFFSET, M2, x2, y2, vx2, vy2);
if (mouseButton != LEFT) reset();
if (key == ' ' | key == ENTER) reset();
surface.setTitle(FC + frameCount + FR + round(frameRate));
int idx, int x, int y, float m,
float px, float py, float vx, float vy) {
M + idx + MASS + round(m) + LF +
POS + round(px) + COMMA + round(py) + LF +
VEL + round(vx*SPD) + COMMA + round(vy*SPD);