最近需要用到矩形相交演算法的簡單應用,所以特地拿一個很簡單的演算法出來供新手參考,為什麼說是給新手的參考呢因為這個演算法效率並不是很高,但是這個演算法只有簡簡單單的三行。程式使用了兩種方法來判斷是否重疊/相交,如果有興趣可以看一下,如果覺得有bug可以留言。代碼僅供參考。 C#中矩形的方法為Rectangl ...
最近需要用到矩形相交演算法的簡單應用,所以特地拿一個很簡單的演算法出來供新手參考,為什麼說是給新手的參考呢因為這個演算法效率並不是很高,但是這個演算法只有簡簡單單的三行。程式使用了兩種方法來判斷是否重疊/相交,如果有興趣可以看一下,如果覺得有bug可以留言。代碼僅供參考。
C#中矩形的方法為Rectangl(起始點坐標, 矩形的大小)或Rectangl(起始點x坐標, 起始點y坐標, 矩形寬, 矩形高),起始點為矩形區域的左上角。
方法一
姑且叫做“井字法”吧,延長其中一個矩形的四邊使其形成一“井”字(如圖)並劃分成九塊區域,分區域來判斷另一個矩形的點是否在此矩形內。
1.當生成的矩形的起始坐標點在3,6,7,8,9區域時,所生成的矩形必定不相交;
2.當生成的矩形起始點坐標在1,2,4區域時候,保證新矩形的右下角點的x坐標小於待比較矩形起始點的x坐標 或 新矩形的右下角點的y坐標小於待比較矩形起始點的y坐標 即可;
3.當生成的矩形位於5區域內時,只要保證新矩形右下角點的x和y坐標小於待比較矩形右下角點的x和y坐標即可;
4.在考慮兩矩形是否重疊時不需要考慮第3條,當需要考慮是否內含時需要用第3條判斷。
參考代碼:
1 int flag = 0; //設置標記值,預設為重疊 2 if (rectangle1.X > rectangle2.X + rectangle2.Width || rectangle1.Y > rectangle2.Y + rectangle2.Height) flag++; //初始點在3,6,7,8,9區域 3 else if (rectangle1.X + rectangle1.Width < rectangle2.X || rectangle1.Y + rectangle1.Height < rectangle2.Y) flag++; //初始點在1區域 4 else if (rectangle1.X > rectangle2.X && rectangle1.Y > rectangle2.Y && rectangle1.X + rectangle1.Width < rectangle2.X + rectangle2.Width && rectangle1.Y + rectangle1.Height < rectangle2.Y + rectangle2.Height) flag++; //初始點在5區域 5 6 if (flag == 0) textBox1.Text = "重疊"; 7 else textBox1.Text = "不重疊";
結果演示:
方法二
這個就簡單多了,直接使用IntersectsWith方法直接可以判斷是否重疊,是不是簡單多了?但是它只能判斷兩個矩形是否重疊,內含的情況也算在重疊之內,需要使用此方法時可以考慮方法一。
1 if (rectangle1.IntersectsWith(rectangle2)) textBox1.Text = "重疊"; 2 else textBox1.Text = "不重疊";
結果演示:
後記
此代碼沒有詳細考慮邊界相切問題,需要需要讀者再加以考慮修改,也僅僅是提供新手一些思路或來考慮更複雜的推廣應用,同時附源代碼於文末供參考。另外時間、水平有限,代碼難免有些小問題望讀者海涵。
源代碼:https://files-cdn.cnblogs.com/files/shenyuanfeng/RectangleIntersect.zip