這個演算法我在上篇博文《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; }
至於還有兩種情況,就是兩個角處於區域內和四個角都在低層的區域內,這兩種情況都必須滿足第一個條件,就是一個角處於區域內,所以不用再次判斷。