題目 大意:給定乙個簡單多邊形,求多邊形內的一點到所有邊界的最小距離最大。題目事實上就是叫你求這個簡單多邊形的內切圓半徑。
我的做法是二分內切圓半徑,然後通過對簡單多邊形半平面交判定實現的。在判斷結束時,我出現了點邏輯性錯誤,居然求點到邊的距離,那麼我就對原簡單多邊形做半平面交,直至這個交後新簡單多邊形面積為很小即可,結果tle很多次,開始還以為是演算法角度問題引起二分處死迴圈。事實上,我只需用普通的判斷二分內切圓半徑的上下界只差小於一定值即可,改之ac了。一次經驗教訓。演算法複雜度為二分次數乘 o(n^2),基本上可以說是o(n^2).
二分內切圓半徑和簡單多邊形半平面交主要實現如下:
由於本題資料最大為100個點,所以還有一種o(n^3)的演算法,是通過對簡單多邊形上邊的列舉,每列舉三條邊,求其內切圓半徑,然後取最小者即為答案。根據三邊求內切圓半徑具體步驟是:
判斷是否有平行邊,如果3條邊均平行則無內切圓,2條邊平行則平行邊距離一半為內切圓半徑。
判斷是否存在某條邊與其他2條邊的交點在其延長線上,如果是則不存在內切圓。
根據內切圓半徑乘與周長等於面積的二倍,即可求出內切圓半徑。
上面演算法具體實現可以參考greatadam 的部落格。
sgu上的題目largest circle 也是求簡單多邊形的內切圓半徑,但它的資料最大為10000個點,所以上面2中方法都可能會超時(我用我程式交上去卻是wa,在case 4),需要更優化的演算法,gccfeli大牛 有一種更好的演算法,可惜看不懂。
Python實現任意多邊形的最大內切圓演算法
參考matlab計算輪廓內切圓 初衷是為了求裂縫的最大寬度 直接上 import random import cv2 import math import numpy as np from numpy.ma import cos,sin import matplotlib.pyplot as plt...
求多邊形的面積
多邊形的面積求法 在草稿紙上面我們,我們就把它考慮成組合圖形去處理,所以我們是把他不斷的拆分,因為我們是不可以直接去求它的面積的。那麼在我們的電腦裡面,我們用 怎麼去去求面積呢?因為我們不是提前知道他們的組合圖形,所以我們不知道怎麼樣去求,或者說按照什麼圖形的面積求法,去求。當邊數為3的時候,我們知...
求多邊形的面積
定理1 已知三角形 a1a2a3的頂點座標ai xi yi i 1,2,3 它的重心座標為 xg x1 x2 x3 3 yg y1 y2 y3 3 定理2 已知三角形 a1a2a3的頂點座標ai xi yi i 1,2,3 該三角形的有向面積為 s x2 x1 y3 y1 x3 x1 y2 y1 2...