已知线段各点经纬度,判断线段相交函数

来源:互联网 发布:微博短文情感数据集 编辑:程序博客网 时间:2024/04/28 15:53

判断线段相交,往往都是以平面坐标系为基础来判断,如果坐标系是地球坐标系,知道的是经纬度应该如何判断呢?本文主要关注的就是此问题。

假设:线段各点之间距离不是很大,可认为都在同一平面上。

如果线段长度很长,无法满足假设的情况,则此算法未必适用。

 

提供功能:

* 函数名称: GetXY
* 功能描述: 获得点A相对于点B的平面坐标系

 

* 函数名称: CrossFuntion
* 功能描述: 求两矢量的叉积

 

*类名称:TLine

*功能:判断两线段是否相交

 

 

struct TSectorPoint
{
 double dCellLon;
 double dCellLat;
};

struct TXYPoint
{
 double X;
 double Y;
};

 

//线段类
class TLine
{
public:
 TLine(const TSectorPoint StartPoint,const TSectorPoint EndPoint);
 bool IsLineCross(TLine line);
private:
 TSectorPoint P1;
 TSectorPoint P2;

};

 

/**********************************************************************
* 函数名称: GetXY
* 功能描述: 获得点A相对于点B的平面坐标系
* 输入参数:
* 输出参数:
* 返 回 值: 无
* 其它说明: 无
* 修改日期    版本号     修改人:philbert      修改内容
***********************************************************************/
void GetXY(TSectorPoint pointA,TSectorPoint pointB,TXYPoint &pointAB)
{
 double disAB=CalcDistance(pointA.dCellLon,pointA.dCellLat,pointB.dCellLon,pointB.dCellLat);

 double ABAngel=CalcAngleByLonLat(pointB.dCellLon,pointB.dCellLat,pointA.dCellLon,pointA.dCellLat);
 pointAB.X=disAB*sin(ABAngel*PI/HALF_CIRCLE_ANGLE);
 pointAB.Y=disAB*cos(ABAngel*PI/HALF_CIRCLE_ANGLE);
}

/**********************************************************************
* 函数名称: CrossFuntion
* 功能描述: 求两矢量的叉积
* 输入参数:
* 输出参数:
* 返 回 值: 无
* 其它说明: 无
* 修改日期    版本号     修改人:philbert            修改内容
***********************************************************************/
double CrossFuntion(TXYPoint pointA,TXYPoint pointB)
{
 return(pointA.X*pointB.Y-pointB.X*pointA.Y);
}

TLine::TLine(TSectorPoint StartPoint,TSectorPoint EndPoint)
{
 P1=StartPoint;
 P2=EndPoint;
}
bool TLine::IsLineCross(TLine line)
{
 //以line的P2为坐标原点的平面坐标系坐标
 TXYPoint P1Q2;
 GetXY(P1,line.P2,P1Q2);

 TXYPoint Q1Q2;
 GetXY(line.P1,line.P2,Q1Q2);

 TXYPoint P2Q2;
 GetXY(P2,line.P2,P2Q2);

 //以P1为坐标原点的平面坐标系坐标
 TXYPoint Q1P1;
 GetXY(line.P1,P1,Q1P1);

 TXYPoint P2P1;
 GetXY(P2,P1,P2P1);

 TXYPoint Q2P1;
 GetXY(line.P2,P1,Q2P1);

 if(CrossFuntion(P1Q2,Q1Q2)*CrossFuntion(Q1Q2,P2Q2)>0
 &&(CrossFuntion(Q1P1,P2P1)*CrossFuntion(P2P1,Q2P1)>0))
 {
  return true;
 }
 return false;
}

原创粉丝点击