本文基础是地球坐标系下判断线段相交,请参考
http://blog.csdn.net/philipzeng/archive/2010/07/22/5754339.aspx
能判断线段相交了,多边形相交问题也就迎刃而解。
class PolygonRegion
{
public:
explicit PolygonRegion(vector<TSectorPoint> &vRegion);
bool __stdcall IsOverlap(vector<TSectorPoint> vRegion);
private:
vector<TSectorPoint> vPoints;
};
/**********************************************************************
* 函数名称: Polygon
* 功能描述: 多边形类构造函数
* 输入参数:
* 输出参数:
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
***********************************************************************/
PolygonRegion::PolygonRegion(vector<TSectorPoint> &vRegion)
{
vPoints=vRegion;
}
/**********************************************************************
* 函数名称: IsOverlap
* 功能描述: 判断是否与另外一个多边形相交
* 输入参数:
* 输出参数:
* 返 回 值: 无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
***********************************************************************/
bool __stdcall PolygonRegion::IsOverlap(vector<TSectorPoint> vPolygon)
{
vPoints.push_back(vPoints[0]);
vPolygon.push_back(vPolygon[0]);
for(unsigned int iLoop=0;iLoop < vPoints.size()-1;iLoop++)
{
TLine line(vPoints[iLoop],vPoints[iLoop+1]);
for(unsigned int iLoop2=0;iLoop2 < vPolygon.size()-1;iLoop2++)
{
TLine checkline(vPolygon[iLoop2],vPolygon[iLoop2+1]);
if(line.IsLineCross(checkline)==true)
{
vPoints.pop_back();
return true;
}
}
TLine checkline(vPolygon[0],vPolygon[vPolygon.size()-1]);
if(line.IsLineCross(checkline)==true)
{
vPoints.pop_back();
return true;
}
}
vPoints.pop_back();
return false;
}