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;

}

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值