private void redrawAll() {
    l1.setOffset(h1.getXOffset() + h1.getWidth() / 2, l1.getYOffset());
    l2.setOffset(h2.getXOffset() + h2.getWidth() / 2, l2.getYOffset());

    n1.setOffset(h1.getXOffset(), n1.getYOffset());
    n2.setOffset(h2.getXOffset(), n2.getYOffset());

    Point2D c1 = n1.getFullBounds().getCenter2D();
    Point2D c2 = n2.getFullBounds().getCenter2D();

    double dist = Math.abs(n2.getXOffset() - N - n1.getXOffset());
    double t = dist < F ? dist / F : 1;

    Point2D t1 = translate(rotate(new Point2D.Double(R[0] * (1 - t), 0), -A[0]), c1);
    Point2D t2 = translate(rotate(new Point2D.Double(R[1], 0), -A[1]), clipX(c2, c1));
    t2 =
        translate(
            makeDistanceFromOrigin(
                t2.getX() - c1.getX(), t2.getY() - c1.getY(), dist(t2, c1) * (1 - t)),
            c1);

    k1.centerBoundsOnPoint(t1.getX(), t1.getY());
    k2.centerBoundsOnPoint(t2.getX(), t2.getY());

    arc.reset();
    arc.moveTo((float) c1.getX(), (float) c1.getY());
    arc.curveTo(
        (float) t1.getX(), (float) t1.getY(),
        (float) t2.getX(), (float) t2.getY(),
        (float) c2.getX(), (float) c2.getY());

    redrawArrows(
        c1.getX(), c1.getY(),
        t1.getX(), t1.getY(),
        t2.getX(), t2.getY(),
        c2.getX(), c2.getY());
  }