こんばんは、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の座標が違うところでこの関数を呼び出しても値が同じだったりと、おかしな結果になってしまいます(どうおかしい結果なのかも書くべきなのだとは思うのですが、法則性をまだ見つけられていないので・・・)
もしどの部分が間違っているのかが解りそうでしたら、教えて頂けると助かります、数学的知識の勘違いや、単純なくだらないミスなのかもしれませんが、宜しくお願いします。
No.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」です。
領域が重なっているかどうか、とか、中心同士の距離とか、判定方法を考えなおした方がよいのでは
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 3つの倍精度浮動小数点値の平均を求めて、3つの引数全てを平均値に変更するメソッドを作成し、キーボード 1 2022/07/13 16:04
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- スピーカー・コンポ・ステレオ PC -> USB DAC -> スピーカーアンプ -> パッシブスピーカーでつないで音が出ない 10 2022/10/10 20:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
多人数のじゃんけんプログラム
-
COMコンポーネントって何?
-
VBA 同じ名前のオブジェクトを...
-
ワイルドカード<?>と型パラメー...
-
VBAのWindowオブジェクトとWork...
-
文字列でクラス型名を取得したい
-
Listに格納されているオブジェ...
-
オブジェクト名をforループ内で...
-
ArrayLsitのデータ取得
-
LISTBOXの内容が更新されま...
-
Visual Studioでのbmpファイル...
-
パワーポイントのVBAでテキスト...
-
.getElementById()のエラーにつ...
-
C#でフォームのオブジェクト名...
-
Listに格納されたオブジェクト...
-
Vbで通常使用するプリンターを...
-
Excelで =EMBED("Acrobat Docu...
-
VBAからノーツを起動
-
Java認定試験3級の問題です。 ...
-
BufferedWriterのcloseメソッド
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報