一生使いまわせる
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線分の交点
コメントを投稿