objective-c判斷點是否在多邊形內(包括在多邊形上)的一個經典算法

/** 檢查某點是否包含在多邊形的範圍內(只用與判斷在多邊形內部,不包含點在多邊形邊上的情況)~ */
- (BOOL) checkPointWithinPolygon:(PolyVerticesWrapper*)pvw point:(b2Vec2)point {
    int verticesCount = [pvw verticesCount];
    b2Vec2 *ptPolygon = [pvw vertices];
    
    int nCross = 0;
    for (int i = 0; i < verticesCount; ++ i) {
        float j = ptPolygon[i].x;
        float k = ptPolygon[i].y;
        float m = ptPolygon[(i + 1) % verticesCount].x;
        float n = ptPolygon[(i + 1) % verticesCount].y;
        b2Vec2 p1(j, k);
        b2Vec2 p2(m, n);
    
       //求解 y=p.y與 p1 p2 的交點
        if ( p1.y == p2.y ) {  // p1p2與 y=p0.y平行
            continue;
        }
        if ( point.y < fminf(p1.y, p2.y) ) {//交點在p1p2延長線上 
            continue;             
        }
        if ( point.y > fmaxf(p1.y, p2.y) ) {//交點在p1p2延長線上 
            continue;
        }
       //求交點的 X座標
        double x = (double)(point.y - p1.y) * (double)(p2.x - p1.x) / (double)(p2.y - p1.y) + p1.x;

        if ( x > point.x ) { // 只統計單邊交點 
            nCross++;            
        }
    }
    if(nCross%2 != 0) {   //單邊交點爲偶數,點在多邊形之外
        return YES;
    } else {
        return NO; 
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章