学校で習ったベクトルがようやく役にたつとき!
こんな感じ
問題は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 コメント :: 当たり判定 線分と円
コメントを投稿