300分,如何用坐标方法判断两个panel是否相交?(300分)

  • 主题发起人 主题发起人 nsj
  • 开始时间 开始时间
N

nsj

Unregistered / Unconfirmed
GUEST, unregistred user!
空间相交,也就是说这两个控件有重叠;包括:
空间相交、边相交、顶点相交
 
用两个控件的clientrect来用这个函数IntersectRect来判断是否有相交。
 
TYZhang 太厉害了,什么都懂,我都没有听说过这个函数[:(]
 
to mstar:
谢谢捧场!以前在做贴图是用过。
 
没用过这两个函数,佩服:)
不过我想可以转换成数学方法做。分别记录两个panel的左上角(x1,y1),(x3,y3),左下角(x2,y2),(x4,y4),然后以第一个panel的坐标为基准,比较坐标就行了吧。
 
呵呵,学习。
否则我只会用 Panel1.BoundsRect和ptInRect。
 
老兄,我刚才测试了一下,用clientrect不行的!!!
要用两个控件的BoundsRect和IntersectRect函数

Unit Types
function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
 
to yostgxf:
老兄说得有理。用ClientRect确实不对。[^]
 
好象只四个顶点,两个长宽就行了
 
不是的,ClientRect.left和ClientRect.top永远为零
ClientRect.Right和ClientRect.Bottom是控件的宽度和高度
 
yostgxf说的有道理,可是我如何判断是内部相交还是边相交或则顶点相交呢?
 
你的内部相交是包含?
边相交和顶点相交是什么?是。。(不好画)
 
function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
1。内部相交(Rect=R1 或 Rect=R2)
2。边相交(否则,Rect的任一顶点不是R1 或R2的顶点)
3。顶点相交(否则,Rect的某一顶点是R1 或R2的顶点)

我的理解对吗?
 
判断返回的矩形:
1、顶点相交:返回的矩形宽=0 且 高=0;
2、边相交:返回的矩形的宽=0 或 高=0;
3、内相交:返回的矩形=原先的一个矩形;
4、否则是普通相交。
 
内部就是除顶点和四条边之外的panel空间;内部相交也就是说rect2相交于rect1的除顶点和四条边之外的panel空间;边相交就是rect1和rect2在某边重合;点相交就是rect1和rect2在某点重合
 
2,3还是有问题
2。边相交(否则,Rect的相连的二个顶点不是R1 或R2的顶点)//如果是不行
3。顶点相交(否则,Rect的相对的二个顶点是/不是R1 或R2的顶点)
 
我理解对了的,并且所有情况都考虑了。
可是实现起来有点复杂。再考虑优化一下
 
这样,换个思路!这样实现可能方便一些

function IntersectRect(out Rect: TRect; const R1, R2: TRect): Boolean;
1。内部相交(Rect=R1 或 Rect=R2)
否则再用ptInRect
2。边相交或交叉相交(二个顶点或0个顶点在另一个Rect内)
3。顶点相交(一个顶点在另一个Rect内)
 
to yostgxf:
你的2、3可否这样优化:
1、顶点相交:返回的矩形Rect 宽=0 且 高=0;
2、边相交:返回的矩形Rect 宽=0 或 高=0;

if (Rect.Left=Rect.Right)and(Rect.Top=Rect.Bottom)
then //点相交
else if (Rect.Left=Rect.Right)or(Rect.Top=Rect.Bottom)
then //边相交
else ....
 
to TYZhang:
我估计你理解错了,他的顶点相交并不是顶点相接。边相交同理
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
922
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部