狸貓的面試 專案描述 向量裁剪

2021-07-11 13:34:51 字數 1307 閱讀 6186

專案描述:

要求:在4s內,用單執行緒,完成對百萬級的向量圖形的裁剪

輸入:1.乙個多邊形(儲存在xml檔案中,順序儲存多邊形所有的端點)

2.乙個向量圖形(line或者circle)。line儲存其兩個端點ab,circle儲存其圓心o和半徑r。(實際有一百萬條直線和一百萬個圓)

輸出:輸出裁剪後的圖形。例如

裁剪過程(以一條直線為例):

1.計算該直線與多邊形的所有交點,並儲存。

2.由交點拼湊成線段,然後計算該線段的中點是否在多邊形內部

3.如果在則保留該線段

4.如果不在則刪除該線段

詳述:

在計算直線與多邊形所有交點時,採用了定比分點法。

在由交點拼湊直線時,出現了如下問題

(a)中,交點的順序應該是501234  但是實際儲存的順序是012345.這會使得將45也算做線段的情況。出現這種情況的原因是,求交點時,從多邊形任意一條邊開始,而不是靠近線段端點的那條邊。

解決的辦法:採用排序的方式,將交點到該直線a點的距離,一次排序。

關於定理:」線段一點在多邊形內部,則線段在多邊形內部「的證明:

證明:先說明如何確定一點是否在多邊形內部:

由該線段一點,向右做一條射線,則如果這條射線與多邊形的交點為偶數個,則入點與出點保持一致。如果為奇數,則說明入點少乙個(因為最後射線出了多邊形的範圍,所以不會少 出點)

假設,該線段不在多邊形內部,但因其有一點在多邊形內部,則該線段必然存在交點。但由上述內容可知,該線段不與多邊形有交點,因此,上述定理成立。

結果:

狸貓的面試 鍊錶

1.找出鍊錶的中間元素 解法 鍊錶的特點是容易增刪,難於隨機訪問。如果按照常規的想法 1 遍歷鍊錶,獲取長度 2 從頭走1 2步 但是這種方式會需要o 1.5n 可以採用如下方式 兩個人賽跑,如果a的速度是b的兩倍,則當a到達終點時,b則剛到中點。這樣,只需要遍歷一遍即可。2.鍊錶的排序 解法 排序...

Matlab 向量裁剪柵格應該注意的問題

還不點贊收藏?等你用到了,估計找不到資料了 摘要很多matlab向量裁剪柵格的內容,看得一頭霧水,本文也來簡要說說如何使用向量裁剪柵格。思想 重要 利用向量裁剪柵格,我沒有找到什麼好用的函式,其核心思想目前我仍然是取值賦值,先找到向量邊界圖形的boundary range,即經度和緯度最大最小值,然...

使用向量面裁剪柵格資料的對齊問題

最近湊巧有幾個比較多的柵格裁剪問題,整理如下 我們只有由於柵格與向量資料的儲存模型不相同,這就導致柵格資料的像元無法與向量資料的點等同,從而導致裁切後的對齊問題,放大資料我們就能發現,如下圖可以說明 其中黑白色為柵格資料,每個正方形代表乙個像元,紅色區域為向量面資料。我們按照預設設定執行 raste...