# OpenVc判断矩形是否相交算法

339人阅读 评论(0)

1、直线是否相交

BOOL IsLineSegmentCross(POINT pt1, POINT pt2, POINT pt3, POINT pt4,int iLinesRelation)
{
int iL1,iL2,iL3,iL4,iMax;
if(iLinesRelation==0)  //平行关系
{
if(pt1.y==pt2.y)//横线
{
if(pt1.y!=pt3.y)
return FALSE;
else    //两条线Y值相同
{
iL1=abs(pt1.x-pt2.x);
iL2=abs(pt3.x-pt4.x);
iL3=abs(pt3.x-pt2.x);
iL4=abs(pt4.x-pt1.x);
if(iL3>iL4)
iMax=iL3;
else
iMax=iL4;
if(iL1+iL2
return FALSE;
else
return TRUE;
}
}
else     //坚线
{
if(pt1.x!=pt3.x)
return FALSE;
else
{
iL1=abs(pt1.y-pt2.y);
iL2=abs(pt3.y-pt4.y);
iL3=abs(pt2.y-pt3.y);
iL4=abs(pt1.y-pt4.y);
if(iL3>iL4)
iMax=iL3;
else
iMax=iL4;
if(iL1+iL2
return FALSE;
else
return TRUE;
}
}
}
else      //垂直关系
{
if(pt1.y==pt2.y)//横线
{
if(pt3.xpt2.x)
return FALSE;
else
{
if(pt1.y>=pt3.y&&pt1.y<=pt4.y)
return TRUE;
else
return FALSE;
}
}
else     //坚线
{
if(pt1.xpt4.x)
return FALSE;
else
{
if(pt3.y>=pt1.y&&pt3.y<=pt2.y)
return TRUE;
else
return FALSE;
}
}
}
return TRUE;
}
2、矩形是否相交

BOOL CNetXPlayerDlg::RectIsCross(RECT _Rect1,RECT _Rect2)
{
POINT pt1,pt2,pt3,pt4;
//
pt1.x=_Rect1.left;
pt1.y=_Rect1.top;
pt2.x=_Rect1.right;
pt2.y=_Rect1.top;

pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.top;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.right;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.bottom;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.left;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
//
pt1.x=_Rect1.right;
pt1.y=_Rect1.top;
pt2.x=_Rect1.right;
pt2.y=_Rect1.bottom;

pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.top;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.right;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.bottom;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.left;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
//
pt1.x=_Rect1.left;
pt1.y=_Rect1.bottom;
pt2.x=_Rect1.right;
pt2.y=_Rect1.bottom;

pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.top;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.right;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.bottom;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.left;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
//
pt1.x=_Rect1.left;
pt1.y=_Rect1.top;
pt2.x=_Rect1.left;
pt2.y=_Rect1.bottom;

pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.top;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.right;
pt3.y=_Rect2.top;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.bottom;
pt4.x=_Rect2.right;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,1))
return TRUE;
pt3.x=_Rect2.left;
pt3.y=_Rect2.top;
pt4.x=_Rect2.left;
pt4.y=_Rect2.bottom;
if(IsLineSegmentCross(pt1,pt2,pt3,pt4,0))
return TRUE;
return FALSE;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：22736次
• 积分：300
• 等级：
• 排名：千里之外
• 原创：6篇
• 转载：13篇
• 译文：0篇
• 评论：3条
文章分类
评论排行
最新评论