/// <summary> /// 正規化する /// </summary> void Normalize() { float f = 1.0f / vNormal.Length(); if (f != 0) { vNormal *= f; distance *= f; } }
/// <summary> /// 光線r = p + tdが円sと交差しているかどうかを判定(静止している円rS1に対して交差) /// </summary> /// <param name="c1">円1</param> /// <param name="c2">円2</param> /// <param name="v1">方向ベクトル</param> /// <param name="v2">対象とする円</param> /// <return>trueを返す場合、交差していて、衝突の時間が*pfTに格納される</return> bool MCMovingCircleCircle(MCCircle2 c1, MCCircle2 c2, MCVector2 v1, MCVector2 v2, out float time) { time = 0; // 円s1をs0の半径にまで拡張 MCCircle2 S1Ex = c2; S1Ex.R += c1.R; // s0およびs1の両方からs1の運動を引き算し、s1を静止させる MCVector2 v = v1 - v2; // これで、方向のある線分 s = s0.c + tv, v = (*pV0-*pV1)/||*pV0-*pV1|| を // 拡張した円に対して交差させることができる MCVector2 vIntersect; float fVLen = v.Length(); v /= fVLen; if (IntersectRayCircle(c1.C, v, S1Ex, out time, out vIntersect)) { return(time <= fVLen); } return(false); }