計算幾何--判斷平行坐標軸的2矩形是否有交集


2D平面內 如果有2個邊分別平行於直接坐標軸的矩形a,b. 如果判斷a,b是否有公共面積?

下面簡單介紹2個方法

1.隊友告訴的方法 可以很方便的計算出2矩形相交面積的大小

分別找到2個矩形右下角的坐標中最小的x(minx)和最小的y(miny)

在找到2個矩形左上角坐標中最大的x(maxx)和最大的y(maxy)

最后 相交的矩形即對角線[minx,miny]--[maxx,maxy]所構成的矩形 當然如果minx>maxx或miny>maxy矩形不相交

 

2.我以前使用的方法 根據兩個矩形的中心相對位置來判斷是否有交集

設2個矩形a,b的中心分別為oa ob(這個很容易求出) 通過作圖很容易發現 如果2個矩形要有交集必須滿足2個條件

oa ob橫坐標距離<兩矩形橫邊和/2   oaob縱坐標距離<兩矩形縱邊和/2 這個看上圖很明顯

所有有了以下函數 這2個方法都是O(1)時間內完成的

x1,y1--x2,y2            x3,y3--x4,y4 分別是2個矩形的對角線頂點坐標

方法一:

/*****************
Author:夏天的風
Function:To determine whether 2 paralleled rectangle share common area
****
      if(x1>x2) swap(x1,x2);
      if(y1>y2) swap(y1,y2);
      if(x3>x4) swap(x3,x4);
      if(y3>y4) swap(y3,y4);
      lx=max(x1,x3); ly=max(y1,y3);
      rx=min(x2,x4); ry=min(y2,y4);
      if(lx>rx||ly>ry) puts("0.00");
      else printf("%.2f\n",(rx-lx)*(ry-ly));

  

方法二:(整點,可以改寫為浮點數)

/************************
Author: lxglbk
Function: To determine whether 2 paralleled rectangle share common area
********
bool Cross_Rect(const Rect & a,const Rect & b)
{
	return ( abs((a.x1+a.x2)-(b.x1+b.x2))<(a.x2-a.x1+b.x2-b.x1)
		&& abs((a.y1+a.y2)-(b.y1+b.y2))<(a.y2-a.y1+b.y2-b.y1) );
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM