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;}
  • 相关阅读:
    C++类内存分布
    职场人理财之指数基金篇
    职场之殇---有些事情千万不能做
    职场人为什么需要理财
    职场发展之跟对老板有多重要
    职场中怎么做好一个演讲
    多线程如何按指定顺序同步执行
    多线程抢票系统浅析
    Spring Boot进阶系列三
    Spring Boot进阶系列二
  • 原文地址:https://www.cnblogs.com/terra/p/6987051.html
Copyright © 2011-2022 走看看