摸魚的時候看到了一個題,是個老鐵在面試泰康時候作的拔高題。咱們也來解一下。前端
經過計算重疊面積獲得面試
好了,暫時就想到了這幾個方案,你還有嗎?算法
baseList = [ {type: 'rect', x: 0, y: 0, w: 100, h: 100} ] warnList = [ {type: 'round', x: 60, y: 95, r: 10}, {type: 'round', x: 50, y: 80, r: 10}, {type: 'round', x: 20, y: 30, r: 10}, {type: 'round', x: 70, y: 50, r: 10}, {type: 'round', x: 80, y: 25, r: 10} ]
有了基礎數據咱們就能夠開始搞了,咱們把圓定義爲 10。canvas
function isSafe(x, y) { // 具備危險的地點 var dangers = warnList // 兩點的距離 return dangers.every((p1)=>{ return Math.sqrt(Math.pow(p1.x - x, 2) + Math.pow(p1.y - y, 2)) > p1.r }) }
baseList = [ {type: 'rect', x: 0, y: 0, w: 100, h: 100} ] warnList = [ {type: 'round', x: 60, y: 95, r: 10}, {type: 'round', x: 50, y: 80, r: 10}, {type: 'round', x: 20, y: 30, r: 10}, {type: 'round', x: 70, y: 50, r: 10}, {type: 'round', x: 80, y: 25, r: 10} ] function isSafe(x, y) { // 具備危險的地點 var dangers = warnList // 兩點的距離 return dangers.every((p1)=>{ return Math.sqrt(Math.pow(p1.x - x, 2) + Math.pow(p1.y - y, 2)) > p1.r }) } count = 0;//循環次數表明點數,其實能夠直接乘出來。 countSafe = 0; for(let xStart = baseList[0].x, xEnd = baseList[0].x + baseList[0].w; xStart <= xEnd; xStart++ ){ for(let yStart = baseList[0].y, yEnd = baseList[0].y + baseList[0].h; yStart <= yEnd; yStart++ ){ count++ if(isSafe(xStart, yStart)) countSafe++ } } console.log(count, countSafe, 1-(countSafe/count))
感受這個方案好的一點是能夠看到結果segmentfault
jsrun的調試地址:http://jsrun.net/yH6Kp/edit微信
感受這樣的圖比較類似
spa
今天在網上找計算圓與矩形、圓與圓重疊面積的題,結果發現了這個算法,咱們也來實現一下。.net
歡迎你們關注個人公衆號。有疑問也能夠加個人微信前端交流羣。3d