struct StdPoint
{
double x, y, z;
};
#define IS_BETWEEN(a, x, b) (((a) <= (x) && (x) <= (b)) || ((b) <= (x) && (x) <= (a)))
BOOL Get_Crossing_FS(StdPoint& ptCross, StdPoint a1, StdPoint a2, StdPoint b1, StdPoint b2, BOOL bExtend)
{
// 构建向量
double a_dx = a2.x - a1.x;
double a_dy = a2.y - a1.y;
double b_dx = b2.x - b1.x;
double b_dy = b2.y - b1.y;
double div = a_dx * b_dy - b_dx * a_dy;
// 判断平行(比较的参数值为0.01,DBL_EPSILON_FS值过小),经纬度精度不够
if (-0.00001f <= div || div <=0.00001f)
return FALSE;
double lambda = ((b1.x - a1.x) * b_dy - b_dx * (b1.y - a1.y)) / div;
ptCross.x = a1.x + lambda * a_dx;
ptCross.y = a1.y + lambda * a_dy;
if (bExtend == TRUE)
return TRUE;
//不延长情况判断点是否在a1_a2 b1_b2内部
if (EqualDouble(a1.x,a2.x) == FALSE && IS_BETWEEN(a1.x,ptCross.x,a2.x) == FALSE)
return FALSE;
if (EqualDouble(a1.y,a2.y) == FALSE && IS_BETWEEN(a1.y,ptCross.y,a2.y) == FALSE)
return FALSE;
if (EqualDouble(b1.x,b2.x) == FALSE && IS_BETWEEN(b1.x,ptCross.x,b2.x) == FALSE)
return FALSE;
if (EqualDouble(b1.y,b2.y) == FALSE && IS_BETWEEN(b1.y,ptCross.y,b2.y) == FALSE)
return FALSE;
return TRUE;
}