絕對定位的層判斷是否有相互覆蓋的解決演算法

胡尐睿丶發表於2013-07-16

  這個演算法我在上篇博文《jQuery 模擬 ubuntu 3D desktop 的 Dodge Effect 效果》中有提到過。

  但那時想法過於簡單,當時的解決思路是隻要層的一個角的座標處於另一個層的所在區域,則視窗就會有覆蓋。這一點沒有錯,但還有一些特殊情況。比如:

//       _______    _______          _____
//   ___|       |  |       |___    _|     |___
//  |   |       |  |       |   |  | |     |   |
//  |___|       |  |       |___|  |_|     |___|
//      |_______|  |_______|        |_____|
//      _____       ___________      _____
//   __|_____|__   |           |   _|_____|___
//  |           |  |           |  |           |
//  |           |  |___________|  |___________|
//  |___________|     |_____|       |_____|

  下面的程式碼需要配合上篇文章的程式碼看,我只提供核心的判斷程式碼了

//  常規情況,只要有一個角處於區域內,則可以判斷視窗有覆蓋
//   _______            _______        _______    _______
//  |    ___|___    ___|       |   ___|___    |  |       |___
//  |   |       |  |   |       |  |       |   |  |       |   |
//  |___|       |  |   |_______|  |       |___|  |_______|   |
//      |_______|  |_______|      |_______|          |_______|
if(
	(thisStartX >= baseStartX && thisStartX <= baseEndX && thisStartY >= baseStartY && thisStartY <= baseEndY)
	||
	(thisStartX >= baseStartX && thisStartX <= baseEndX && thisEndY >= baseStartY && thisEndY <= baseEndY)
	||
	(thisEndX >= baseStartX && thisEndX <= baseEndX && thisStartY >= baseStartY && thisStartY <= baseEndY)
	||
	(thisEndX >= baseStartX && thisEndX <= baseEndX && thisEndY >= baseStartY && thisEndY <= baseEndY)
){
	flag = true;
}
//  非常規情況
//       _______    _______          _____
//   ___|       |  |       |___    _|     |___
//  |   |       |  |       |   |  | |     |   |
//  |___|       |  |       |___|  |_|     |___|
//      |_______|  |_______|        |_____|
if(
	(thisStartX >= baseStartX && thisStartX <= baseEndX && thisStartY < baseStartY && thisEndY > baseEndY)
	||
	(thisEndX >= baseStartX && thisEndX <= baseEndX && thisStartY < baseStartY && thisEndY > baseEndY)
){
	flag = true;
}
//      _____       ___________      _____
//   __|_____|__   |           |   _|_____|___
//  |           |  |           |  |           |
//  |           |  |___________|  |___________|
//  |___________|     |_____|       |_____|
if(
	(thisStartY >= baseStartY && thisStartY <= baseEndY && thisStartX < baseStartX && thisEndX > baseEndX)
	||
	(thisEndY >= baseStartY && thisEndY <= baseEndY && thisStartX < baseStartX && thisEndX > baseEndX)
){
	flag = true;
}

  至於還有兩種情況,就是兩個角處於區域內和四個角都在低層的區域內,這兩種情況都必須滿足第一個條件,就是一個角處於區域內,所以不用再次判斷。

相關文章