Re: [問題] 關於一個邏輯

看板C_Sharp作者 (Litfal)時間10年前 (2013/12/26 01:15), 編輯推噓1(103)
留言4則, 1人參與, 最新討論串3/3 (看更多)
※ 引述《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)

12/26 20:38, , 1F
3Q 我在想想看~
12/26 20:38, 1F

12/26 20:43, , 2F
哇 3Q大大 你說的方法好酷 因為我不知道有這一個方法可以用..
12/26 20:43, 2F

12/26 20:44, , 3F
加上我的概念不是很好 所以第二個方法不太能理解~"~ 但還是很
12/26 20:44, 3F

12/26 20:45, , 4F
謝謝大大您的幫助 這樣我就可以安心的寫遊戲了XDDD
12/26 20:45, 4F
文章代碼(AID): #1IknAloi (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #1IknAloi (C_Sharp)