open processingにあるこちらのコードで分からない部分があります.

void bounce(Particle a, Particle b) {
if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) < (a.radius + b.radius)) {
    if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) > sqrt(pow(
            a.posX + a.vX - b.posX - b.vX, 2)
            + pow(a.posY + a.vY - b.posY - b.vY, 2))) {

        float commonTangentAngle = atan2(b.posX - a.posX, b.posY
                - a.posY)
                + asin(1);

最初のif文で距離を取っているのは分かるんですが,そのあとに続くifの条件分

        if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) > sqrt(pow(
            a.posX + a.vX - b.posX - b.vX, 2)
            + pow(a.posY + a.vY - b.posY - b.vY, 2))) {

とcommonTangentAngleの示す意味がよくわかりません.プログラミングというより物理運動の公式だと思いますが…初歩的な物理すらわからないのでひょっとすると教科書レベルの公式なのかもしれませんが詳しく教えてください.