作者Litfal (Litfal)
看板C_Sharp
标题Re: [问题] 关於一个逻辑
时间Thu Dec 26 01:15:24 2013
※ 引述《deo2000 (800IM)》之铭言:
: ※ 引述《ymzk (ymzk = false;)》之铭言:
: : 请问如果我有一个表单内有两个按钮 大小位置都不定
: : 按钮会乱跑
: : 如何判断这两个按钮有现在有没有撞到?(边碰到也算 或两个叠在一起)
: 设原点在左上角
: 按钮1的4个座标
: A B
: C D
: 按钮2的4个座标
: a b
: c d
: bool bCross=false;
: //检测a点是否与按钮1重叠?
: if(( a.x >= A.x ) && (a.x <= D.x ) && (a.y >= A.y) && (a.y <= D.y))
: bCross=ture;
: else if(...略)//检测b点是否与按钮1重叠?
: bCross=ture;
: else if(...略)//检测c点是否与按钮1重叠?
: bCross=ture;
: else if(...略)//检测d点是否与按钮1重叠?
: bCross=ture;
: else
: bCross=false;//无重叠
没那麽麻烦,用.net framework提供的方法就好了。
若是方形的按钮:
bool isIntersecting = button1.Bounds.IntersectsWith(button2.Bounds);
想想空间中的逻辑也是不错,不过你把问题搞复杂了。
判断两个矩形是否重叠,只要判断他们在X轴与Y轴是否都有相交(部分或完全重叠)就好了
Rectangle r1 = button1.Bounds;
Rectangle r2 = button2.Bounds;
X轴判断法为
任一矩形的右侧,都一定比另一个的左侧,来的更右边。
bool xIntersect = (r1.Right > r2.Left) && (r2.Right > r1.Left);
不懂的话请画两条线想一想。
L1------R1
L2---------R2
Y轴判断依此类推,只是变成上下。
bool yIntersect = (r1.Bottom > r2.Top) && (r2.Bottom > r1.Top);
X的部分能懂,Y就一定也懂。
最後判断是否都有相交。空间上不懂的话,也请画个图想想。
bool isIntersecting = xIntersect && yIntersect;
若要我用文字完整叙述这段逻辑,我会这样说:
若两正矩形在X轴与Y轴的投影均相交的话,代表两矩形相交。
也可以写成一行,因为短路运算会快一点。
bool isIntersecting = (r1.Right > r2.Left) && (r2.Right > r1.Left) &&
(r1.Bottom > r2.Top) && (r2.Bottom > r1.Top);
至於非矩形就是另一回事了,
不过Winform控制项的话,大多可以用GraphicsPath或Region解决。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.179.10
※ 编辑: Litfal 来自: 220.135.179.10 (12/26 01:18)
※ 编辑: Litfal 来自: 220.135.179.10 (12/26 01:26)
※ 编辑: Litfal 来自: 220.135.179.10 (12/26 01:28)
※ 编辑: Litfal 来自: 220.135.179.10 (12/26 01:30)
1F:→ ymzk:3Q 我在想想看~ 12/26 20:38
2F:推 ymzk:哇 3Q大大 你说的方法好酷 因为我不知道有这一个方法可以用.. 12/26 20:43
3F:→ ymzk:加上我的概念不是很好 所以第二个方法不太能理解~"~ 但还是很 12/26 20:44
4F:→ ymzk:谢谢大大您的帮助 这样我就可以安心的写游戏了XDDD 12/26 20:45