[线段相交] 0807

模版,注意使用int可能在求叉乘的过程中溢出,解决办法:使用double(使用int在在返回时只返回符号有时也可以);

使用double的:

# include <cmath>

const double eps = 1e-8;

struct Point{double x, y;} ;

int dcmp(double x)
{
    if (fabs(x) < eps) return 0;
    return x>0 ? 1:-1;
}

int direction(Point p1, Point p2, Point p3)
{
    double tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y);
    return dcmp(tmp);
}

char isCross(Point p1, Point p2, Point p3, Point p4)
{
    int d1 = direction(p3, p4, p1);
    int d2 = direction(p3, p4, p2);
    int d3 = direction(p1, p2, p3);
    int d4 = direction(p1, p2, p4);
    if (d1*d2 < 0 && d3*d4 < 0) return 1;
    return 0;
}

使用int返回符号的:

struct Point{int x, y;} ;
  
int direction(Point p1, Point p2, Point p3)
{
    int tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y);
    if (tmp == 0) return 0;
    return tmp>0 ? 1:-1;
}
  
char isCross(Point p1, Point p2, Point p3, Point p4)
{
    int d1 = direction(p3, p4, p1);
    int d2 = direction(p3, p4, p2);
    int d3 = direction(p1, p2, p3);
    int d4 = direction(p1, p2, p4);
    if (d1*d2 < 0 && d3*d4 < 0) return 1;
    return 0;
}

posted on 2012-08-07 09:26  getgoing  阅读(163)  评论(0编辑  收藏  举报

导航