• 计算几何模板(未调试,更新中)


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

    干脆写了一个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;}
  • 相关阅读:
    kafka 简单调试
    audit调优
    html使用的特殊符号&lt; &gt: &amp;等 意义对照
    nohup /dev/null 2>&1 含义详解
    K8S etcd参数优化
    Linux下安装VMware Tools 的方法
    PHP操作MySQL数据库5个步骤
    Win7下mysql root账户登录提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)解决方案
    VS 报cmath(19): error C2061: 语法错误: 标识符“acosf” 错误
    win7 装了VB虚拟机 开始挺好用 后来突然就打不开了 提示如下错误:(如图)创建 COM 对象失败.
  • 原文地址:https://www.cnblogs.com/terra/p/6987051.html
Copyright © 2020-2023  润新知