プロが教える店舗&オフィスのセキュリティ対策術

こんばんは、C++のゲームプログラミングで、当たり判定を作成しているのですが、どうしても上手くいかず、困っています。

エラー等ではなく、単純にどこが間違っているのか解らない、といった類の質問をするのはあまり良く無いのかもしれませんが、自分ではどうすればいいのか解らないので、ここで質問させて頂きます、よろしくお願いします。

作りたいのは、あるオブジェクトCの頂点の座標から直線の方程式、ax+by+cの、a,b,cを求め、接触しているからを確認したいオブジェクトTの頂点座標との距離を |ax0+by0+c|/√a*a+b*b の式を使って求めるプログラムです。

ソースコードは以下になります。

bool Object::Check_Collision2(Object Collision)
{
Sub_bShow(false);//自分自身には処理をしない。
point C[5]={0};//対象の頂点4つ、計算しやすいように配列は5つまで作ってある。
point T[4]={0};///呼び出し側のオブジェクトの頂点4つ
double C_Distance = sqrtf((Collision.Ref_x_size()/2*Collision.Ref_x_size()/2)+(Collision.Ref_y_size()/2*Collision.Ref_y_size()/2));//中心から頂点までの距離を計算
double T_Distance = sqrtf((Ref_x_size()/2*Ref_x_size()/2)+(Ref_y_size()/2*Ref_y_size()/2));
for(int i=0;i<=3;i++)
{
//頂点の値を配列に代入
C[i].x = Collision.Ref_x() + cos((Ref_Angle()+45+(90*i)) * PI / 180.0f) *C_Distance;
C[i].y = Collision.Ref_y() + sin((Ref_Angle()+45+(90*i)) * PI / 180.0f) *C_Distance;
T[i].x = Ref_x() + cos((Ref_Angle()+45+(90*i)) * PI / 180.0f) *T_Distance;
T[i].y = Ref_y() + sin((Ref_Angle()+45+(90*i)) * PI / 180.0f) *T_Distance;

}
C[4].x=C[0].x;
C[4].y=C[0].y;//forで計算しやすいようにするための処理



//あとは二点間の直線の方程式 ax+by+cを求めて、点と直線の距離の公式で出来る・・・はず。
if(Collision.Ref_bShow()==true)//確認する対象は参照するべき相手かを確認
{

if(Collision.Ref_Collision()==true)//当たり判定を有するか
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
double a =(C[i].y-C[i+1].y);
double b =-(C[i].x-C[i+1].x);
double c =( ((C[i].x-C[i+1].x)*C[i+1].y) - ((C[i].y-C[i+1].y)*C[i+1].x));


//呼び出したオブジェクトと引数のオブジェクトの接触を判定する


if ( (fabs((a*T[j].x)+(b*T[j].y)+c) /hypot(a,b))<=10.0 )
{
return(true);
}

}
}
return(false);
}
else
{
return(false);
}
}
else
{
return(false);
}
}

このソースコードで試してみたのですが、上手くいかず、数値を確認してみると、(fabs((a*T[j].x)+(b*T[j].y)+c) /hypot(a,b))の値がTの座標が違うところでこの関数を呼び出しても値が同じだったりと、おかしな結果になってしまいます(どうおかしい結果なのかも書くべきなのだとは思うのですが、法則性をまだ見つけられていないので・・・)

もしどの部分が間違っているのかが解りそうでしたら、教えて頂けると助かります、数学的知識の勘違いや、単純なくだらないミスなのかもしれませんが、宜しくお願いします。

A 回答 (1件)

関係ないだろうけど


sqrtfとか180.0fとか、float型を使ってるのはなぜ?
> double C_Distance = sqrtf(...
とか完全に意味ないことだけど。

> fabs((a*T[j].x)+(b*T[j].y)+c) /hypot(a,b))の値がTの座標が違うところでこの関数を呼び出しても値が同じだったり

直線と同じ距離にある点は、直線を挟んで2つ存在します。(距離>0のとき)。なので、「値が同じ」だけでは、計算間違いなのか、あなたの思い違いかわかりません。

あと、これは「『直線』と点の距離」です。「『線分』と点の距離」ではありません。オブジェクトCから、はるか遠く跳なれて画面外になるほどだとしても、線分の延長線上なら「距離0」です。

領域が重なっているかどうか、とか、中心同士の距離とか、判定方法を考えなおした方がよいのでは
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!