学校で習ったベクトルがようやく役にたつとき!
こんな感じ
問題はHCの長さを求める計算だけど、まず点Hの場所をベクトルを使って求める。
ベクトルAHはベクトルABをt倍したものとできるので、tを求めれば場所がわかる。
という式の変形でtが求められる。
public static bool CircleLineCollide(Vector2 center, float radius,Vector2 lineStart, Vector2 lineEnd, ref CircleLineCollisionResult result) { Vector2 AC = center - lineStart; Vector2 AB = lineEnd - lineStart; float ab2 = AB.LengthSquared(); if(ab2 <= 0f) { return false; } float acab = Vector2.Dot(AC, AB); float t = acab / ab2;
tが負の場合、または1以上の場合は線分ABからはみ出てるので調整する
if(t < 0.0f) { t = 0.0f;//点Hが点Aの場所になる } else if(t > 1.0f) { t = 1.0f;//点Hが点Bの場所になる }
交点は当たり判定通知用の構造体、CircleLineCollisionResultにしまう。
円の半径と、距離を比較して結果を出す。
result.Point = lineStart + t * AB; result.Normal = center - result.Point; float h2 = result.Normal.LengthSquared(); float r2 = radius * radius; if(h2 > r2) { result.Collision = false; } else { result.Normal.Normalize(); result.Distance = (radius - (center - result.Point).Length()); result.Collision = true; } return result.Collision; }
きれいに書いてみたかったのでTEXを使ってみた。環境をつくるのがめんどい。図はGRAPESを使ってみました。使い方が独特だけど、簡単に図形がかけてよい感じ。
0 コメント :: 当たり判定 線分と円
コメントを投稿