解一道泰康的拔高面試題:面積佔比

摸魚的時候看到了一個題,是個老鐵在面試泰康時候作的拔高題。咱們也來解一下。前端

image.png

解題思路

  1. 以前不是作個刮刮卡嘛,裏面就有刮開佔比的顯示,那咱們直接用這個方案來解題豈不是美滋滋。刮刮卡效果實現
    image.png
  2. 經過計算重疊面積獲得面試

    1. 先計算全部圓和矩形的重疊面積,而後把面積加起來
    2. 由於還有一些圓是重疊的,因此咱們須要計算圓和圓的重疊面積,減去
  3. 經過計算矩形每一個點是否在圓內,而後求出佔比。

好了,暫時就想到了這幾個方案,你還有嗎?算法

基礎數據

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))

image.png

canvas 計算:0.1364

感受這個方案好的一點是能夠看到結果segmentfault

jsrun的調試地址:http://jsrun.net/yH6Kp/edit微信

步長精度是 1

image.png

步長精度是 4

image.png

調整半徑爲15

感受這樣的圖比較類似
image.pngspa

蒙特卡洛算法(統計模擬法,我認爲是玄學算法)

今天在網上找計算圓與矩形圓與圓重疊面積的題,結果發現了這個算法,咱們也來實現一下。.net

9999999次:0.14850091485009154

image.png

99999999次:0.14849383148493833

image.png

9999次:0.1472147214721472

image.png

微信公衆號:前端linong

歡迎你們關注個人公衆號。有疑問也能夠加個人微信前端交流羣。3d

clipboard.png

相關文章
相關標籤/搜索