内積を用いた移動する線分と円の衝突判定について
内積を用いた移動する線分と円の衝突判定について
作成しているプログラムはピンボールのフリッパーとボールとの衝突判定です。14歳からはじめるリアルに動くゲーム物理プログラミング教室C言語編と言う本を参考にプログラミングしています。左フリッパーが315度~360度、1度~45度の範囲を1度づつ移動する度に衝突判定をする関数を作成し、衝突した場合に関数から抜け、戻り値としてボールの情報を持つ構造体の中の反射スピードと反射座標を返すものです。
ここからが質問なのですが、ボールは全くフリッパーの衝突と関係の無い所で反射してしまいます。移動しない線分の両端の座標を与えた衝突判定(壁)では正しく判定するのですが、角度を与えて移動する線分(フリッパー)では上手くいきません。お分かりになる方いらっしゃいましたら、宜しくお願い致します。
関数に渡す引数はその時のボールの座標・速度などの構造体と左フリッパーの角度です。
以下ソースコード
//左フリッパーの軸と成る座標
float hx_l = (cx_l*ZOOM); //フリッパーのx座標
float hy_l = (cy_l*ZOOM+HORIZ); //フリッパーのy座標
//ベクトル a の成分を求める
float ax=xy.posx-hx_l; //線分始点からボール中心へのベクトル
float ay=xy.posy-hy_l; //線分始点からボール中心へのベクトル
//ベクトル b の成分を求める
float bx=((cx_l+cos(ToRadian(angler_l))*clubr)*ZOOM)-hx_l; //線分始点から終点へのベクトル
float by=((cy_l-sin(ToRadian(angler_l))*clubr)*ZOOM+HORIZ)-hy_l;//線分始点から終点へのベクトル
float inpro=ax*bx+ay*by; //ベクトル a,b の内積を求める
float bl=bx*bx+by*by; //ベクトル b の長さの二乗(線分始点から終点へのベクトル
if(inpro>-ZERO1 && inpro<(bl+ZERO1)){ //フリッパーとの衝突判定
//ベクトル a の線分がボールの半径より小さければ交差している
if((ax*ax+ay*ay)-pow(inpro/sqrt(bl),2) < pow(xy.radius,2)){
以下判定後の処理‥‥
ベクトルbのbx,byを求める式でangler_lが引数として渡されるフリッパーの角度に成ります。ToRadian()は関数で角度をラジアンに変更します。
お礼
ご返答ありがとうございます。 自分と同じ疑問を持った方がいらっしゃると ちょっと安心?しますね^^ 私は最高4千万だしたことがあります。 うまい人になると億単位みたいですねー