您的位置:首页 > 移动开发 > Objective-C

objective-c判断点是否在多边形内(包括在多边形上)的一个经典算法

2011-10-02 15:28 369 查看
/** 检查某点是否包含在多边形的范围内(只用与判断在多边形内部,不包含点在多边形边上的情况)~ */
- (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; 
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 float
相关文章推荐