class GBPolygon {
public:
int _numVertices;
std::vector<CCPoint> _verticesVec;
};
点跟多边形的碰撞
static bool PointInPolygon(const CCPoint & p, const GBPolygon & polygon)
{
int nCross = 0;
int nCount = polygon._verticesVec.size();
for (int i = 0; i<nCount; i++) {
CCPoint p1 = polygon._verticesVec[i];
CCPoint p2 = polygon._verticesVec[(i+1)%nCount];
// 求解 y=p.y 与 p1p2 的交点
if(p1.y == p2.y) continue; // p1p2 与 y=p0.y平行
if(p.y<(p1.y<p2.y?p1.y:p2.y)) continue;// 交点在p1p2延长线上
if(p.y>=(p1.y>p2.y?p1.y:p2.y)) continue;// 交点在p1p2延长线上
// 求交点的 X 坐标 --------------------------------------------------------------
float x = (p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
if (x>p.x) {
nCross++;// 只统计单边交点
}
}
// 单边交点为偶数,点在多边形之外 ---
return (nCross%2==1);
}
本文介绍了一个用于检测点是否在多边形内的C++实现方法。通过遍历多边形的边,计算点与每条边的交点,并统计交点数量,当交点数为奇数时,表示点在多边形内部。
1万+

被折叠的 条评论
为什么被折叠?



