zoukankan      html  css  js  c++  java
  • [线段相交] 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;
    }
  • 相关阅读:
    (转)Java new一个对象的过程中发生了什么
    多线程面试题集锦
    java调用ffmpeg获取视频文件信息的一些参数
    单点登录系统SSO实现
    Docker 项目上线
    Docker
    Docker
    Docker
    Docker
    Docker
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2626112.html
Copyright © 2011-2022 走看看