선분교차 알고리즘
2009/09/15 09:53
int isIntersection(NsDPoint ptA1, NsDPoint ptA2,NsDPoint ptB1,NsDPoint ptB2)
{
if ((Direction(ptA1, ptA2, ptB1) *
Direction(ptA1, ptA2, ptB2) <= 0) &&
(Direction(ptB1, ptB2, ptA1) *
Direction(ptB1, ptB2, ptA2) <= 0))
return true;
else return false;
}
int Direction(NsDPoint A,NsDPoint B,NsDPoint C)
{
double dxAB, dxAC, dyAB, dyAC;
int Dir;
dxAB = B.x - A.x; dyAB = B.y - A.y;
dxAC = C.x - A.x; dyAC = C.y - A.y;
if (dxAB * dyAC > dyAB * dxAC) Dir = 1;
if (dxAB * dyAC < dyAB * dxAC) Dir = -1;
if (dxAB * dyAC == dyAB * dxAC) {
if (dxAB == 0 && dyAB == 0) Dir = 0;
if ((dxAB * dxAC < 0) || (dyAB * dyAC < 0)) Dir = -1;
else if ((dxAB * dxAB + dyAB * dyAB) >=
(dxAC * dxAC + dyAC*dyAC)) Dir = 0;
else Dir = 1;
}
return Dir;
}


struct NsDPoint { double x,y; };
로 가정.
struct NsDLine { NsDPoint pt1,pt2; };
로 만들어서 쓰던지.
어딘가에서 긁어온거 약간 수정함.
#include<iostream>
using namespace std;
typedef struct
{
int m_nTop;
int m_nBottom;
int m_nLeft;
int m_nRight;
}STRect, *PSTRect;
bool IsScopeCheck( int a_nStart , int a_nEnd , int a_nNumber )
{
if ( a_nStart <= a_nNumber && a_nEnd >= a_nNumber ) return true;
return false;
}
bool IsOverlapRect(STRect& a_stRect1 , STRect& a_stRect2)
{
if ( IsScopeCheck( a_stRect1.m_nLeft , a_stRect1.m_nRight , a_stRect2.m_nLeft ) ||
IsScopeCheck( a_stRect1.m_nLeft , a_stRect1.m_nRight , a_stRect2.m_nRight ) )
if ( IsScopeCheck( a_stRect1.m_nBottom , a_stRect1.m_nTop , a_stRect2.m_nBottom ) ||
IsScopeCheck( a_stRect1.m_nBottom , a_stRect1.m_nTop , a_stRect2.m_nTop ) ) return true;
return false;
}
int main()
{
STRect stRect1,stRect2;
cin >> stRect1.m_nLeft >> stRect1.m_nBottom >> stRect1.m_nRight >> stRect1.m_nTop;
cin >> stRect2.m_nLeft >> stRect2.m_nBottom >> stRect2.m_nRight >> stRect2.m_nTop;
if ( true == IsOverlapRect( stRect1 , stRect2 ) )
cout << "Overlap" << endl;
else
cout << "Not Overlap" << endl;
return 0;
}
하지만 이건 사각형인걸요 ㅠㅜ