请教 判断两个矩形是否存在重叠部分的算法

leekkeek 2006-01-09 01:18:32
如题
...全文
980 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
crycoming 2006-01-11
  • 打赏
  • 举报
回复
两个矩形相交 还有包含等情况 不一定角是在另外一个矩形内
如:医院标志的红十字 两个矩形的角都不在另外一个矩形内
vbman2003 2006-01-11
  • 打赏
  • 举报
回复
用intersectrect。比如:

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Public Declare Function IntersectRect Lib "user32" ( _
lpDestRect As RECT, _
lpSrc1Rect As RECT, _
lpSrc2Rect As RECT _
) As Long

Option Explicit

Private Function iRect(ByRef iRect1 As RECT, ByRef iRect2 As RECT) As Boolean
Dim rtLong As Long
Dim mRT As RECT
rtLong = IntersectRect(mRT, iRect1, iRect2)
If rtLong > 0 Then
iRect = True
Else
iRect = False
End If
End Function

'窗体上加二个Shape
Private Sub Command1_Click()
Dim rt1 As RECT, rt2 As RECT
Dim BRect As Boolean

rt1.Top = Shape1.Top
rt1.Left = Shape1.Left
rt1.Bottom = Shape1.Top + Shape1.Height
rt1.Right = Shape1.Left + Shape1.Width

rt2.Top = Shape2.Top
rt2.Left = Shape2.Left
rt2.Bottom = Shape2.Top + Shape2.Height
rt2.Right = Shape2.Left + Shape2.Width

BRect = iRect(rt1, rt2)
If BRect = True Then
MsgBox "相交"
Else
MsgBox "不相交"
End If
End Sub
熊孩子开学喽 2006-01-11
  • 打赏
  • 举报
回复
这不是很简单的判断问题么,都是矩形,只要计算初试点坐标和宽高,比较一下大小就可以了,速度又快,算法又简单,
proer9988 2006-01-10
  • 打赏
  • 举报
回复
2楼的方法比较正规!
VBToy 2006-01-10
  • 打赏
  • 举报
回复
用javascript写的算法:
function clashed(x1,y1,w1,h1,x2,y2,w2,h2)
{
//判断两个方块是否碰撞
if ((x1 < x2) && ((x2 - x1) >= w1))
return false;
if ((x1 > x2) && ((x1 - x2) >= w2))
return false;
if ((y1 < y2) && ((y2 - y1) >= h1))
return false;
if ((y1 > y2) && ((y1 - y2)>= h2))
return false;
return true;
}
kamengwang 2006-01-10
  • 打赏
  • 举报
回复
x1,y1 x2,y1
┌─────────┐
│ x3,y3│ x4,y3
│ ┌─┼─────┐
│ │ │ │
└───────┼─┘ │
x1,y2 │ x2,y2 │
└───────┘
x3,y4 x4,y4

矩形重叠的情况有三种:
1 一个矩形的一个角在另一个矩形内。
2 一个矩形的两个角在另一个矩形内。
3 一个矩形的四个角在另一个矩形内。

可见,两矩形重叠的充要条件是至少有一个矩形的一个角在另一个矩形内。所以,只要对两个矩形轮流判断,其中一个矩形的xi,yi是否符合 x1<=xi<=x2 且 y1<=yi<=y2(x1,x2,y1,y2是另一矩形坐标,且x1<x2,y1<y2)。只要有一个符合条件就可以跳出循环。




找的是角...
junki 2006-01-10
  • 打赏
  • 举报
回复
用坐标判断不会很精确,
如果只是很小很小的重叠,计算量将会很大.
of123 2006-01-10
  • 打赏
  • 举报
回复
x1,y1 x2,y1
┌─────────┐
│ x3,y3│ x4,y3
│ ┌─┼─────┐
│ │ │ │
└───────┼─┘ │
x1,y2 │ x2,y2 │
└───────┘
x3,y4 x4,y4

矩形重叠的情况有三种:
1 一个矩形的一个角在另一个矩形内。
2 一个矩形的两个角在另一个矩形内。
3 一个矩形的四个角在另一个矩形内。

可见,两矩形重叠的充要条件是至少有一个矩形的一个角在另一个矩形内。所以,只要对两个矩形轮流判断,其中一个矩形的xi,yi是否符合 x1<=xi<=x2 且 y1<=yi<=y2(x1,x2,y1,y2是另一矩形坐标,且x1<x2,y1<y2)。只要有一个符合条件就可以跳出循环。
proer9988 2006-01-10
  • 打赏
  • 举报
回复
rem 做个例子,方便初学者。
rem 判断两个矩形是否存在重叠部分的算法
rem 以下代码放入Form1中并放入Shape1 ,shape2,Command1

Option Explicit
Private Declare Function IntersectRect Lib "user32" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long
Private Type RECT
X1 As Long
Y1 As Long
X2 As Long
Y2 As Long
End Type
Dim RECT1 As RECT
Dim RECT2 As RECT
Dim DEST_REST As RECT
'测试
Private Sub Command1_Click()
If setRECT(Shape1, Shape2) > 0 Then
Debug.Print "相交!"
Else
Debug.Print "不相交!"
End If
End Sub

'通用函数,测试2个控件是否相交
'返回值大于0---相交
'返回值等于0---不相交
Function setRECT(obj1 As Control, obj2 As Control) As Long
RECT1.X1 = obj1.Left
RECT1.Y1 = obj1.Top
RECT1.X2 = obj1.Left + obj1.Width
RECT1.Y2 = obj1.Top + obj1.Height
RECT2.X1 = obj2.Left
RECT2.Y1 = obj2.Top
RECT2.X2 = obj2.Left + obj2.Width
RECT2.Y2 = obj2.Top + obj2.Height
setRECT = IntersectRect(DEST_REST, RECT1, RECT2)
End Function
rainstormmaster 2006-01-09
  • 打赏
  • 举报
回复
用intersectrect:
【VB声明】
Private Declare Function IntersectRect Lib "user32" Alias "IntersectRect" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT) As Long

【说明】
这个函数在lpDestRect里载入一个矩形,它是lpSrc1Rect与lpSrc2Rect两个矩形的交集。如两个源矩形根本未发生重叠,则lpDestRect会被设为一个空矩形

【返回值】
Long,非零表示成功,零表示失败。会设置GetLastError

【参数表】
lpDestRect ----- RECT,目标矩形,用于包含lpSrc1Rect与lpSrc2Rect两个矩形的重合部分

lpSrc1Rect ----- RECT,第一个源矩形

lpSrc2Rect ----- RECT,第二个源矩形
jlum99 2006-01-09
  • 打赏
  • 举报
回复
好象有相关的函数,两个矩形就是两个rect ,或者就去找找游戏里的碰撞检测的代码,有通用算法

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧