哈羅出行演算法崗筆試題
1.判斷一個座標點是否在不規則多邊形內部的演算法
具體思路:射線法。在給定一個測試點,水平向右畫一條射線,判斷有幾個交點,若交點的個數為偶數則在多邊形外部,為奇數則在多邊形內部。
程式碼如下:
public static boolean isInsidePolygon (double[] point, double[][] polygon) {
// write code here
//找到二維陣列每列的最大值與最小值
double xMin = Double.MAX_VALUE;
double xMax = Double.MIN_VALUE;
double yMin = Double.MAX_VALUE;
double yMax = Double.MIN_VALUE;
for(int i=0;i<polygon.length;i++) {
if(polygon[i][0]<xMin) {
xMin=polygon[i][0];
}
if(polygon[i][0]>xMax) {
xMax=polygon[i][0];
}
if(polygon[i][1]<yMin) {
yMin=polygon[i][1];
}
if(polygon[i][1]>yMax) {
yMax=polygon[i][1];
}
}
double x=point[0],y=point[1];
if(x>xMax||x<xMin||y>yMax||y<yMin) { //如果該點超出所有點圍成的矩形範圍 則返回不在矩形內
return false;
}
boolean contained = false; // 點是否包含在多邊形內
// 核心演算法部分 右水平射線 然後數與多邊形的交點
int N = polygon.length;
for (int i = 0, j = N - 1; i < N; j = i++) { //這意思是沿著邊 遍歷多面體的一圈
if (((polygon[j][1] > y) != (polygon[i][1] > y))
&&x<(polygon[j][0]-polygon[i][0])*(y-polygon[i][1])/(polygon[j][1]-polygon[i][1])+polygon[i][0]) {
contained = !contained;
}
}
return true;
}
程式碼思想:
就是在測試點水平向右發出射線,統計右射線與多邊形相交的交點個數。對多邊形每條邊進行判斷時(1)對於某些不相交的邊,可以採用 (polygon[j][1] > y) != (polygon[i][1] > y)進行排除,該含義是該測試點的縱座標不位於判斷的邊線段之間時,該點直接跳過判斷,因為不可能產生交點。(2)若條件一滿足,進一步進行判斷該水平的右射線與該邊有無交點,位於該測試點左邊的多邊形的邊都不會滿足這個條件。即代入測試點y的座標在(polygon[j][0]-polygon[i][0])*(y-polygon[i][1])/(polygon[j][1]-polygon[i][1])+polygon[i][0]該式子中,就能得出射線與該邊相交處的橫座標x',若x'大於測試點的橫座標x,說明該邊在右邊與該射線有交點,若x'小於x,說明相交的點在x左邊,不屬於右射線的範圍,因此不把該邊納入計數範圍。按照這兩個條件就能統計出右水平射線與該多邊形的交點數。
該演算法非常巧妙能處理一些特殊情況:
1點在多邊形的邊上
前面我們講到,射線法的主要思路就是計算射線穿越多邊形邊界的次數。那麼對於點在多邊形的邊上這種特殊情況,射線出發的這一次,是否應該算作穿越呢?
2點和多邊形的頂點重合
這其實是第一種情況的一個特例。
3射線經過多邊形頂點
射線剛好經過多邊形頂點的時候,應該算一次還是兩次穿越?這種情況比前兩種複雜,也是實現中的難點,後面會講解它的解決方案。
該情況第一條線左線右線都滿足第一條件與第二條件,都各穿一次,為2。
第二條線上線滿足第一條件和第二條件,但下線不滿足第一條件,因此為1。
4射線剛好經過多邊形的一條邊
這是上一種情況的特例,也就是說,射線連續經過了多邊形的兩個相鄰頂點。
該情況1+1=2,左邊穿一次,中線重合不滿足第一條件,然後右邊穿一次。
在該演算法中,穿越頂點也計入次數,好處就在於第二個條件排除了三、四兩種情況
相關文章
- 聯洲筆試題-通訊演算法崗筆試演算法
- 技術崗-常見筆試面試題筆試面試題
- 搶跑IPO,哈囉出行很著急
- 筆試演算法題總結筆試演算法
- 試試哈然後
- 演算法搜狗筆試題加減法演算法筆試
- Flutter 在哈囉出行 B 端創新業務的實踐Flutter
- 攜程演算法筆試題知識點演算法筆試
- 【筆記】哈夫曼樹筆記
- 演算法搜狗筆試題連結串列合併演算法筆試
- 阿里騰訊輪子之戰,哈囉出行能逆襲滴滴、美團嗎?阿里
- 筆試題目——研發工程師筆試題筆試工程師
- 騰訊筆試題筆試
- java筆試題Java筆試
- shell 筆試題筆試
- SQL 筆試題SQL筆試
- 寫給自己看的面試題整理-演算法&某東筆試題面試題演算法筆試
- 20201014:演算法題+筆試題演算法筆試
- 軟體測試崗位的經典面試題面試題
- 哈囉出行遞交招股書 2020年營收60億元營收
- 羅蘭貝格:自動駕駛下的未來交通出行格局自動駕駛
- BAT 經典演算法筆試題 —— 磁碟多路歸併排序BAT演算法筆試排序
- BAT 經典演算法筆試題: 映象二叉樹BAT演算法筆試二叉樹
- 測試筆試多選題筆試
- 軟體測試筆試題筆試
- 哈夫曼樹學習筆記筆記
- 騰訊筆試題集筆試
- php筆試題gtalentPHP筆試
- IT公司筆試題(四)筆試
- c++筆試題C++筆試
- SXF科技筆試題筆試
- linux筆試題Linux筆試
- DBA筆試題(轉)筆試
- DBA筆試試題-考試認證(zt)筆試
- PHP 初級 試崗要求PHP
- 深圳 - 求職測試崗位求職
- 武漢 - 求職測試崗位求職
- HTML最新面試題(筆試面試題)HTML面試題筆試