いろいろ検索して以下のアルゴリズムにたどり着きました。
・点と線分の衝突判定
線分の長さ L1 = sqrt( (x1-x0)^2 + (y1-y0)^2 )
線分の始点から点までの長さ L2 = sqrt( (x2-x0)^2 + (y2-y0)^2 )
(x1-x0)*(x2-x0) + (y1-y0)*(y2-y0) が L1*L2 に等しく、かつL1≧L2の時衝突している
上記のアルゴリズムをDXライブラリで再現しようと思ってプログラムを組んだのですがうまくいきません。具体的には、線分上での衝突判定が行われる所と行われない所があります。
以下のようにプログラムを組みました。
#include <stdio.h>
#include <math.h>
#include "DxLib.h"
int Line_cd(double x_0, double y_0, double x_1, double y_1, double x_2, double y_2, int *Cr2);
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
int x_0=320, y_0=240, x_1=100, y_1=190, x_2=280, y_2=60;
int Cr1=GetColor(0,255,0), Cr2=GetColor(0,255,0);
// while( 裏画面を表画面に反映, メッセージ処理, 画面クリア )
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0){
if (CheckHitKey(KEY_INPUT_UP)){
y_0--;
}
if (CheckHitKey(KEY_INPUT_DOWN)){
y_0++;
}
if (CheckHitKey(KEY_INPUT_LEFT)){
x_0--;
}
if (CheckHitKey(KEY_INPUT_RIGHT)){
x_0++;
}
Line_cd(x_0, y_0, x_1, y_1, x_2, y_2, &Cr2);
DrawPixel(x_0, y_0,Cr1);
DrawLine(x_1,y_1,x_2,y_2,Cr2);
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
//点と線分の衝突判定
int Line_cd(double x_0, double y_0, double x_1, double y_1, double x_2, double y_2, int *Cr2){
int L1, L2;
L1 = sqrt(pow((x_2 - x_1), 2.0) + pow((y_2 - y_1), 2.0)); //線分の長さ
L2 = sqrt(pow((x_0-x_1),2.0)+pow((y_0-y_1),2.0)); //線分の始点から点までの長さ
DrawFormatString(100, 300, *Cr2, "%d %d",L1,L2);
if (((x_2 - x_1)*(x_0 - x_1) + (y_2 - y_1)*(y_0 - y_1)) == L1*L2 ) {
if (L1 >= L2){
*Cr2 = GetColor(255, 0, 0);
return 1; //衝突したら1を返す
}
}
*Cr2 = GetColor(0, 255, 0);
return 0; //衝突しなければ0を返す
}
また、話は変わりますが矩形と線分の衝突判定というのはどのようなものなのでしょうか。