#apply
#include "../_include.txt"
#include "../../define/_vector2.txt"

/*
@param
円1の中心点x
y
移動後の中心点x
y
半径
質量
円2の始点x
y
移動後の中心点x
y
半径
質量

@return
衝突時間 (-1:衝突なし)
円1の中心点x
y
円2の中心点x
y
法線x
y
衝突点x
y
*/
cev[CEV_CIRCLE_TO_CIRCLE] .name(">>>>動く円同士の衝突") bl {
    defv {
        r_time = TV_RETURN
        r_cx1
        r_cy1
        r_cx2
        r_cy2
        r_nx
        r_ny
        r_hx
        r_hy

        a_sx1 = TV_CIRCLE_TO_CIRCLE
        a_sy1
        a_ex1
        a_ey1
        a_ra1
        a_ma1
        a_sx2
        a_sy2
        a_ex2
        a_ey2
        a_ra2
        a_ma2

        sumRad
        sumMass
        time
        sdx
        sdy
        edx
        edy
        dx
        dy
        tP
        tQ
        tR
        tS
    }

    //返り値を初期化
    r_time = -1

    //半径の合計
    sumRad = a_ra1 + a_ra2

    //簡易判定
    V2_ifRectOverlap_ex(a_sx1, a_ex1, a_sx2, a_ex2, sumRad,
    EMPTY_BLOCK, ABORT_BLOCK)

   //始点と終点同士の差
    V2_sub(sdx, a_sx2, a_sx1)
    V2_sub(edx, a_ex2, a_ex1)
    V2_sub(dx, edx, sdx)

    //D.lengthSq
    V2_magSq(tP, dx)

    //最初から衝突している
    @if `sdx * sdx + sdy * sdy <= sumRad * sumRad bl {
        time = 0

    //衝突判定
    } .else bl {
        //判定
        V2_magSq(tP, dx)

        //平行移動している
        @if tP == 0 ABORT_BLOCK

        V2_dot(tQ, sdx, dx, 1)
        V2_magSq(tR, sdx)
        tS = tQ * tQ - tP * (tR - sumRad * sumRad)

        @if tS < 0 ABORT_BLOCK

        //接触、通過時間を算出する
        tS = sqrt(tS, 1)
        time = muldiv(min(-tQ - tS, -tQ + tS), UNIT_SECOND, tP)

        //衝突位置が範囲外にある
        @if `time < 0 || UNIT_SECOND < time ABORT_BLOCK

    }

    //衝突した瞬間の円の座標
    V2_lerp(r_cx1, a_sx1, a_ex1, time, UNIT_SECOND)
    V2_lerp(r_cx2, a_sx2, a_ex2, time, UNIT_SECOND)

    //法線
    //円2から円1に向かう方向に伸びる
    V2_sub(dx, r_cx1, r_cx2)
    V2_mag(tP, dx)

    //中心で重なっている場合、法線は右を向く
    @if tP <= 0 bl {
        V2_set(r_nx, UNIT_NORMAL, 0)

    } .else bl {
        V2_muldiv(r_nx, dx, UNIT_NORMAL, tP)

    }

    //衝突点
    //円2の衝突時の中心座標から円2の半径分、法線方向に伸ばす
    V2_copy(r_hx, r_cx2)
    V2_asAddMuldiv(r_hx, r_nx, a_ra2, UNIT_NORMAL)

    //めり込みを解消する
    @if time <= 0 bl {
        //質量の合計
        sumMass = a_ma1 + a_ma2

        //ゼロ除算を回避する
        @if sumMass == 0 bl {
            a_ma1 = 1
            a_ma2 = 1
            sumMass = 2

        }

        //めり込み量
        tQ = sumRad - tP
        tR = muldiv(a_ma2,  tQ, sumMass)
        tS = muldiv(a_ma1, -tQ, sumMass)

        //円1のめり込みを修正する
        V2_asAddMuldiv(r_cx1, r_nx, tR, UNIT_NORMAL)
        V2_asAddMuldiv(r_cx2, r_nx, tS, UNIT_NORMAL)

    }

    //衝突時間を返す
    r_time = time

}