def setup():
    size(900, 600)
    global canvas, cx, cy
    cx = width / 2
    cy = 200
    canvas = createGraphics(width, height)
    canvas.beginDraw()
    canvas.background(255)
    canvas.endDraw()

    global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
    r1 = 200
    r2 = 200
    m1 = 40
    m2 = 40
    a1 = PI / 2
    a2 = PI / 2
    a1_v = 0
    a2_v = 0
    g = 1

    px2 = -1
    py2 = -1


def draw():

    background(255)
    imageMode(CORNER)
    image(canvas, 0, 0, width, height)
    global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
    num1 = -g * (2 * m1 + m2) * sin(a1)
    num2 = -m2 * g * sin(a1 - 2 * a2)
    num3 = -2 * sin(a1 - a2) * m2
    num4 = a2_v * a2_v * r2 + a1_v * a1_v * r1 * cos(a1 - a2)
    den = r1 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2))
    a1_a = (num1 + num2 + num3 * num4) / den

    num1 = 2 * sin(a1 - a2)
    num2 = a1_v * a1_v * r1 * (m1 + m2)
    num3 = g * (m1 + m2) * cos(a1)
    num4 = a2_v * a2_v * r2 * m2 * cos(a1 - a2)
    den = r2 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2))
    a2_a = (num1 * (num2 + num3 + num4)) / den

    translate(cx, cy)
    stroke(0)
    strokeWeight(2)

    x1 = r1 * sin(a1)
    y1 = r1 * cos(a1)

    x2 = x1 + r2 * sin(a2)
    y2 = y1 + r2 * cos(a2)

    line(0, 0, x1, y1)
    fill(0)
    ellipse(x1, y1, m1, m1)

    line(x1, y1, x2, y2)
    fill(0)
    ellipse(x2, y2, m2, m2)

    a1_v += a1_a
    a2_v += a2_a
    a1 += a1_v
    a2 += a2_v

    canvas.beginDraw()
    canvas.translate(cx, cy)
    canvas.stroke(0)

    if frameCount > 1:
        canvas.line(px2, py2, x2, y2)

    canvas.endDraw()

    px2 = x2
    py2 = y2

