判斷點是否在多邊形上演算法roadMap

2021-06-06 05:24:33 字數 1754 閱讀 2493

經歷了三個版本,雖然都是小改動,但是表現出的效果還是相差蠻大

第一版是移植的別人的

(試用之後我發現點相交於多邊形的邊上效果不是很好)

第二版改善了點相交於多邊形邊上的判斷

(改善之後效果比較明顯,但還是會偶發判斷失準)

第三版增加了數量級的判斷,將偶發性的判斷失準再降下乙個台階

(數值計算誤差是不可避免的,所以在判斷相等的時候,必得要確定乙個可容忍的誤差數量級)

下面上三版的相關**,第二版帶ex,第三版帶exii

/** 檢查多邊形的包圍盒是否相交~ */

-(bool) isboundingboxintersect:(boundingbox)bb1 bb2:(boundingbox)bb2

return no;

}/** 檢查某點是否包含在多邊形的範圍內~ */

-(bool) ispolygoncontainspoint:(bypolygon*)poly point:(b2vec2)p

if (p.y < fminf(p1.y, p2.y))

if (p.y > fmaxf(p1.y, p2.y))

// 求交點的 x 座標~

double x = (double)(p.y-p1.y)*(double)(p2.x-p1.x)/(double)(p2.y-p1.y)+p1.x;

// 只統計單邊交點~

if (x > p.x)

}// 單邊交點為偶數,點在多邊形之外~

if(ncross%2 == 1) else

}/** 對某點正好被包含在多邊形的邊上具有更好的適用性~ */

-(bool) ispolygoncontainspointex:(bypolygon*)poly point:(b2vec2)p

if (p.y < fminf(p1.y, p2.y))

if (p.y > fmaxf(p1.y, p2.y))

// 求交點的 x 座標

double x = (double)(p.y-p1.y)*(double)(p2.x-p1.x)/(double)(p2.y-p1.y)+p1.x;

/** added on 2011.10.02.15.21,是否正好相交在邊上~ */

if (x == p.x)

if (x > p.x)

}if(isintersectonsection || ncross%2==1) else

}/** 對某點正好被包含在多邊形的邊上具有更好的適用性~ */

-(bool) ispolygoncontainspointexii:(bypolygon*)poly point:(b2vec2)p

if (p.y < fminf(p1.y, p2.y))

if (p.y > fmaxf(p1.y, p2.y))

// 求交點的 x 座標

double x = (double)(p.y-p1.y)*(double)(p2.x-p1.x)/(double)(p2.y-p1.y)+p1.x;

/** added on 2011.10.02.15.21,是否正好相交在邊上~ */

// nslog(@" —— x=%f, p.x=%f", x, p.x);

if (fabs(x - p.x) < 10e-4)

if (x > p.x)

}if(isintersectonsection || ncross%2==1) else

}

判斷點是否在多邊形內

1.叉乘判別法 只適用於凸多邊形 想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...

判斷點是否在多邊形中

一 基本知識 以該點為起點,做平行於x軸的,向x軸的正方向的射線,計算該射線與多邊形的邊相交的次數,如果是奇數則在多邊形的裡面,否則反之。然後需要考慮邊界問題 1 如果點在多邊形的邊上則認為是多邊形裡面,這條在實際應用中可忽略,因為在圖形上多邊形的邊是乙個畫素寬度的,很難點到那裡,2 射線和多邊形的...

判斷點是否在多邊形內

判斷點是否在多邊形內有三個步驟 自csdn 第一步 判斷這個點是不是就是多邊形的端點 第二步 判斷這個點是不是落在多邊形的邊界上 第三步 通過這個點橫向作一平行射線,判斷與多邊形的交點數,如果交點是頂點,則交點數加一,結果如果是奇數,則該點落在多邊形之內,如果是偶數,則反之。具體演算法涉及向量叉積,...