当たり判定 2線分の交点

Collisionに実装された当たり判定
一生使いまわせる

2線分の交点。
厚みがない壁などは突き抜けてしまったりするので、移動しているそれぞれのフレームでの移動量(速度)のベクトルと、壁との当たり判定を調べる。

それぞれの線分の始点、終点をVector2で渡す。交差してる場合は交点を戻す。outはC#の参照渡し。
式を計算を進めて変形して実装している。
詳しい計算式はこちら

public static bool LineLineIntersect(Vector2 a, Vector2 b,Vector2 c, Vector2 d, out Vector2 point) {
 point = Vector2.Zero;

 double r, s;
 double denominator = (b.X - a.X) * (d.Y - c.Y) - (b.Y - a.Y)*(d.X - c.X);

 //分母が0の場合平行
 if(denominator == 0) {
  return false;
 }

 double numeratorR = (a.Y - c.Y) * (d.X - c.X) - (a.X - c.X)*(d.Y - c.Y);
 r = numeratorR / denominator;

 double numeratorS = (a.Y - c.Y)*(b.X - a.X) - (a.X - c.X) * (b.Y - a.Y);
 s = numeratorS / denominator;

 //交差しない
 if(r < 0 || r > 1 || s<0 || s > 1) {
  return false;
 }

 point.X = (float)(a.X + (r * (b.X - a.X)));
 point.Y = (float)(a.Y + (r * (b.Y - a.Y)));
 return true;
}

0 コメント :: 当たり判定 2線分の交点

コメントを投稿