zoukankan      html  css  js  c++  java
  • 计算几何模板(未调试,更新中)

    计算几何学习中,一边应用一边订正与更新模板

    干脆写了一个double的和一个long long(避免实数运算)的

     double

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const double eps=1e-7;
    
    struct point{
        double x,y;
        point(){}
        point (double a,double b): x(a),y(b) {}
        
        friend point operator + (const point &a,const point &b){
            return point(a.x+b.x,a.y+b.y);
        }
        
        friend point operator - (const point &a,const point &b){
            return point(a.x-b.x,a.y-b.y);
        }
        
        friend point operator * (const double &r,const point &a){
            return point(r*a.x,r*a.y);
        }
        
        friend bool operator == (const point &a,const point &b){
            return (abs(a.x-b.x)<eps && abs(a.y-b.y)<eps);
        }
        
        double norm(){
            return sqrt(x*x+y*y);
        }      
    };
    
    inline double det(point a,point b) {return a.x*b.y-a.y*b.x;}
    inline double dot(point a,point b) {return a.x*b.x+a.y*b.y;}
    inline double dist(point a,point b) {return (a-b).norm();}
    inline point rotate(point p,double A) 
    {
        return point(p.x*cos(A)-p.y*sin(A),p.x*sin(A)+p.y*cos(A));
    }
    
    inline bool line_cross_segment(point s,point t,point a,point b)
    {
        return !(det(s-a,t-a)*det(s-b,t-b)>eps);
    }
    
    inline bool seg_cross_seg(point a,point b,point c,point d)
    {
        if (min(c.x,d.x)>max(a.x,b.x) || min(a.x,b.x)>max(c.x,d.x) || min(c.y,d.y)>max(a.y,b.y) || min(a.y,b.y)>max(c.y,d.y))
            return false;
        return det(a-c,d-c)*det(b-c,d-c)<eps && det(c-a,b-a)*det(d-a,b-a)<eps;
    }
    
    inline double p_line_dist(point p,point s,point t) {return det(s-p,t-p)/dist(s,t);}
    
    inline point Pro(point p,point s,point t)  //垂足 
    {
        double r=dot(t-s,p-s)/dot(t-s,t-s);
        return s+r*(t-s);
    }
    
    inline bool On (point p,point s,point t){                 //点在线段上 
        return (abs(det(p-s,t-s))<eps && dot(p-s,p-t)<eps);
    }
    
    inline double p_segment_dist(point p,point s,point t) 
    {
        if (On(Pro(p,s,t),s,t)) return p_line_dist(p,s,t);
            else return min(dist(p,s),dist(p,t));
    }
    
    inline bool parallel(point a,point b,point c,point d){return abs(det(a-b,c-d))<eps;}
    
    inline point line_make_point(point s1,point t1,point s2,point t2) //逻辑上必须先判断parallel
    {
        double a1=det(s1-s2,t2-s2);
        double a2=det(t1-s2,t2-s2);
        return 1/(a1-a2)*(a1*t1-a2*s1);
    }

    long long

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    struct point{
        long long x,y;
        point(){}
        point (long long a,long long b): x(a),y(b) {}
        
        friend point operator + (const point &a,const point &b){
            return point(a.x+b.x,a.y+b.y);
        }
        
        friend point operator - (const point &a,const point &b){
            return point(a.x-b.x,a.y-b.y);
        }
        
        friend point operator * (const long long &r,const point &a){
            return point(r*a.x,r*a.y);
        }
        
        friend bool operator == (const point &a,const point &b){
            return a.x==b.x && a.y==b.y;
        }
        
        long long sqrnorm(){
            return x*x+y*y;
        }      
    };
    
    inline long long det(point a,point b) {return a.x*b.y-a.y*b.x;}
    inline long long dot(point a,point b) {return a.x*b.x+a.y*b.y;}
    inline long long sqrdist(point a,point b) {return (a-b).sqrnorm();}
    
    inline bool line_cross_segment(point s,point t,point a,point b)
    {
        return det(s-a,t-a)*det(s-b,t-b)<=0;
    }
    
    inline bool seg_cross_seg(point a,point b,point c,point d)
    {
        if (min(c.x,d.x)>max(a.x,b.x) || min(a.x,b.x)>max(c.x,d.x) || min(c.y,d.y)>max(a.y,b.y) || min(a.y,b.y)>max(c.y,d.y))
            return false;
        return det(a-c,d-c)*det(b-c,d-c)<=0 && det(c-a,b-a)*det(d-a,b-a)<=0;
    }
    
    inline bool On (point p,point s,point t){                 //点在线段上 
        return det(p-s,t-s)==0 && dot(p-s,p-t)<=0;
    }
    
    inline bool parallel(point a,point b,point c,point d){return det(a-b,c-d)==0;}
  • 相关阅读:
    javascript删除JSON元素
    State ,Getter , Mutation , Action , Module
    mutation和action区别
    图片懒加载
    git命令合并分支代码
    vue 项目生产环境下去重console
    rem px pt em (区别)
    npm 安装依赖 以及dependencies 和 devDependencies的区别
    仿百度搜索
    h5页面在移动端需要注意的一些事情
  • 原文地址:https://www.cnblogs.com/terra/p/6987051.html
Copyright © 2011-2022 走看看