#6
by usao » 5年前
とりあえず点の座標を表すこんなのがあったとして…
コード:
//2次元ベクトル
struct Vec
{
Vec( double X=0, double Y=0 ) : X(X),Y(Y) {}
Vec operator+( const Vec &rhs ) const { return Vec( X+rhs.X, Y+rhs.Y ); }
Vec operator-( const Vec &rhs ) const { return Vec( X-rhs.X, Y-rhs.Y ); }
void operator*=( double s ){ X*=s; Y*=s; }
double Norm() const { return sqrt( X*X + Y*Y ); }
double X,Y;
};
//Z成分を0として3次元ベクトルとみなしたときの外積のZ成分
inline double CP( const Vec &lhs, const Vec &rhs ){ return lhs.X*rhs.Y -lhs.Y*rhs.X; }
矩形を4頂点の座標(Vec[4])で表すとき,当たり判定はこんな感じでどうでしょう?
コード:
//IsCollide()から使われる作業関数.
//A[iA]とB[iA]を通る直線がAとBを分離するかどうか調べる
bool DivisionCheck( const Vec (&A)[4], const Vec (&B)[4], int iA, int iB )
{
Vec L = A[iA] - B[iB];
if( L.Norm() <= std::numeric_limits<double>::epsilon() )return false;
double Base = CP( A[ (iA+1)%4 ] - B[iB], L );
for( int i=2; i<4; ++i )
{
if( Base * CP( A[ (iA+i)%4 ] - B[iB], L ) < 0 )return false;
}
for( int i=1; i<4; ++i )
{
if( Base * CP( B[ (iB+i)%4 ] - B[iB], L ) > 0 )return false;
}
return true;
}
//矩形Aと矩形Bとの間の当たり判定
bool IsCollide( const Vec (&A)[4], const Vec (&B)[4] )
{
for( int iA=0; iA<4; ++iA )
{
for( int iB=0; iB<4; ++iB )
{
if( DivisionCheck( A,B, iA,iB ) )return false;
}
}
return true;
}
とりあえず点の座標を表すこんなのがあったとして…
[code]
//2次元ベクトル
struct Vec
{
Vec( double X=0, double Y=0 ) : X(X),Y(Y) {}
Vec operator+( const Vec &rhs ) const { return Vec( X+rhs.X, Y+rhs.Y ); }
Vec operator-( const Vec &rhs ) const { return Vec( X-rhs.X, Y-rhs.Y ); }
void operator*=( double s ){ X*=s; Y*=s; }
double Norm() const { return sqrt( X*X + Y*Y ); }
double X,Y;
};
//Z成分を0として3次元ベクトルとみなしたときの外積のZ成分
inline double CP( const Vec &lhs, const Vec &rhs ){ return lhs.X*rhs.Y -lhs.Y*rhs.X; }
[/code]
矩形を4頂点の座標(Vec[4])で表すとき,当たり判定はこんな感じでどうでしょう?
[code]
//IsCollide()から使われる作業関数.
//A[iA]とB[iA]を通る直線がAとBを分離するかどうか調べる
bool DivisionCheck( const Vec (&A)[4], const Vec (&B)[4], int iA, int iB )
{
Vec L = A[iA] - B[iB];
if( L.Norm() <= std::numeric_limits<double>::epsilon() )return false;
double Base = CP( A[ (iA+1)%4 ] - B[iB], L );
for( int i=2; i<4; ++i )
{
if( Base * CP( A[ (iA+i)%4 ] - B[iB], L ) < 0 )return false;
}
for( int i=1; i<4; ++i )
{
if( Base * CP( B[ (iB+i)%4 ] - B[iB], L ) > 0 )return false;
}
return true;
}
//矩形Aと矩形Bとの間の当たり判定
bool IsCollide( const Vec (&A)[4], const Vec (&B)[4] )
{
for( int iA=0; iA<4; ++iA )
{
for( int iB=0; iB<4; ++iB )
{
if( DivisionCheck( A,B, iA,iB ) )return false;
}
}
return true;
}
[/code]