//一种线段相交判断函数,当且仅当线段u,线段v相交并且交点不是u,v的端点时
//返回的值为true,即两线段相交   
bool CPointsEditDlg::Intersect_A(YLineSeg lineSeg1, YLineSeg lineSeg2)   
{   
return ((Intersect(lineSeg1, lineSeg2))&&  
                         //Euqal_Point判断两线段的两端点是否相等
(!Euqal_Point(lineSeg1.pt1, lineSeg2.pt1))&&   
(!Euqal_Point(lineSeg1.pt1, lineSeg2.pt2))&&   
(!Euqal_Point(lineSeg1.pt2, lineSeg2.pt1))&&   
(!Euqal_Point(lineSeg1.pt2, lineSeg2.pt2)));   
}
//确定两条线段是否相交   
bool CPointsEditDlg::Intersect(YLineSeg lineSeg1 ,YLineSeg lineSeg2)   
{  //排斥验证 
bool bIntersect =
(max(lineSeg1.pt1.x, lineSeg1.pt2.x) >= min(lineSeg2.pt1.x, lineSeg2.pt2.x)) &&   
        (max(lineSeg2.pt1.x, lineSeg2.pt2.x) >= min(lineSeg1.pt1.x, lineSeg1.pt2.x)) &&   
        (max(lineSeg1.pt1.y, lineSeg1.pt2.y) >= min(lineSeg2.pt1.y, lineSeg2.pt2.y)) &&   
        (max(lineSeg2.pt1.y, lineSeg2.pt2.y) >= min(lineSeg1.pt1.y, lineSeg1.pt2.y)) &&
(max(lineSeg1.pt1.z, lineSeg1.pt2.z) >= min(lineSeg2.pt1.z, lineSeg2.pt2.z)) &&
(max(lineSeg2.pt1.z, lineSeg2.pt2.z) >= min(lineSeg1.pt1.z, lineSeg1.pt2.z)) &&

//判断 P1P2 跨立 Q1Q2 的依据是:(P1-Q1)·(Q2-Q1)*(Q2-Q1)·(P2-Q1)>=0 。
 (Multiply(lineSeg2.pt1, lineSeg1.pt2, lineSeg1.pt1)*Multiply(lineSeg1.pt2, lineSeg2.pt2, lineSeg1.pt1) >= 0) &&
//同理判断 Q1Q2 跨立 P1P2 的依据是:(Q1-P1)·(P2-P1)*(P2-P1)·(Q2-P1)>=0 。  
(Multiply(lineSeg1.pt1, lineSeg2.pt2, lineSeg2.pt1)*Multiply(lineSeg2.pt2, lineSeg1.pt2, lineSeg2.pt1) >= 0);
return (bIntersect); 
}   
//P1P2,Q1Q2分别为两线段,求矢量(P1-Q1)和(P2-Q1)的点乘
double CPointsEditDlg::Multiply(FPOINT pt1, FPOINT pt2, FPOINT pt0)
{
   double x1 = pt1.x - pt0.x;
   double y1 = pt1.y - pt0.y;
   double z1 = pt1.z - pt0.z;
   double x2 = pt2.x - pt0.x;
   double y2 = pt2.y - pt0.y;
   double z2 = pt2.z - pt0.z;
  // return x1 * y2 - x2 * y1;
   return  (y1*z2-y2*z1)+(z1*x2-x1*z2)+(x1*y2-x2*y1);