兩個矩形的相交面積,怎麼求演算法效率相對較高?
01-29
補充。矩形不一定平行坐標軸。
目前的做法是找一個完全包含兩個矩形的正的大矩形,判斷大矩形內的每個點是否在兩個小矩形中。程序效率較低。
題目不完整啊,沒有說矩形的邊是否平行於坐標軸,如果有旋轉的話... 這麼複雜的情況咱們還是不討論了吧 (其實就是我不會的意思)那麼假設矩形的邊都平行於坐標軸,分別表示為(left1,top1,right1,bottom1), (left2,top2,right2,bottom2),則相交部分必定也是矩形,算長x寬就可以啦相交部分的寬,可以看成兩個矩形的寬,在x軸上的投影的長度
也就是兩條線段的總長度,減去重疊之後新線段的長度
按下圖示意,算出 A+B-W 就可以了用矩形坐標套進去,就是 overlapX = (right1-left1)+(right2-left2) - ( max(right1,right2) - min(left1,left2) )不管A B兩條線段怎麼移來移去,誰長誰短,這個式子都不變的,如果是&<=0,自然是沒有相交同理再算出高就可以了。這道題有兩種演算法。
1.直接求多邊形面積
多邊形的頂點包括以下兩部分:
- 所有相交的線段交點;
- 所有在對方內部的矩形頂點。
因此整個求解過程可以分為以下四步:
- 找到所有的線段交點;
- 找到所有的在對方內部的矩形頂點;
- 求出以上兩個點集並的凸包;
- 求出凸包面積。
2.半平面交
每個矩形都可以看作四個半平面的交,因此矩形面積交就等價於八個半平面交。
程序略,學習文中演算法可參考:
- 求線段交點:談談"求線段交點"的幾種演算法(js實現,完整版)
- 求點是否在多邊形內部:判斷點在多邊形內的多種寫法
- 求凸包:凸包,計算幾何-經典演算法
- 求多邊形面積:任意多邊形的面積公式
- 半平面交:半平面相交_羅伯斯
求矩形面積,再求多邊形面積,然後相減...
可以先判斷中點的連線距離是否長於對角線和的一半做一些預處理...
把矩形分解為像素進行運算
改進了下。先找矩形交點,再算多邊形面積。效率明顯高了 (o;TωT)o
兩點之間求長和點到直線的距離都是高中的知識吧? 計算出兩個三角形的面積就可以了。
推薦閱讀:
※BitDegradeTree詳解[多圖]
※如何設計演算法計算三維空間中n個點的凸包表面積?
※面試系列之一:關於前端面試演算法的一些建議
※一種簡單的字元轉義演算法
※全球第一款開源線下搜索引擎OpenGenus,線下搜索代碼、演算法