首页 > 其他分享 >计算几何模板

计算几何模板

时间:2023-08-08 17:56:53浏览次数:39  
标签:ld return top stk vec 计算 几何 operator 模板

namespace ComputationGeometry{
    const ld eps=1e-8,pi=acosl(-1.0);
    // 点 / 向量
    struct vec{
        ld x,y;
        vec(ld X=0,ld Y=0){x=X;y=Y;}
        // 输入输出
        void in(){scanf("%Lf%Lf",&x,&y);}
        void out(){printf("%Lf %Lf\n",x,y);}
        // 加减数乘
        vec operator +(vec a){return (vec){x+a.x,y+a.y};}
        vec operator -(vec a){return (vec){x-a.x,y-a.y};}
        vec operator *(ld a){return (vec){x*a,y*a};}
        vec operator /(ld a){return (vec){x/a,y/a};}
        // 旋转 / 绕某一点旋转
        vec rotate(ld t){return (vec){x*cosl(t)+y*sinl(t),-x*sinl(t)+y*cosl(t)};}
        vec rotate(vec a,ld t){return (vec){(x-a.x)*cosl(t)+(y-a.y)*sinl(t)+a.x,-(x-a.x)*sinl(t)+(y-a.y)*cosl(t)+a.y};}
        // 相等
        bool operator ==(vec a){return (fabsl(x-a.x)<eps)&(fabsl(y-a.y)<eps);}
        // 叉乘 / 点乘
        ld operator *(vec a){return x*a.y-y*a.x;}
        ld operator ^(vec a){return x*a.x+y*a.y;}
        ld len(){return sqrtl(x*x+y*y);}
    };
    // 两点斜率
    ld slope(vec a,vec b){return (a.y-b.y)/(a.x-b.x);}
    // 直线 / 线段
    struct line{
        vec p1,p2;
        // 直线斜率
        ld slope(){return (p1.y-p2.y)/(p1.x-p2.x);}
        // 已知 x 求 y
        ld val_y(ld x){
            int k=slope(),b=p1.y-p1.x*k;
            return k*x+b;
        }
        // 已知 y 求 x
        ld val_x(ld y){
            int k=slope(),b=p1.y-p1.x*k;
            return (y-b)/k;
        }
    };
    // 两点之间距离
    inline ld dis(vec a,vec b){return (a-b).len();}
    // 点与直线之间距离
    inline ld dis_line(vec p,line a){return fabsl((p-a.p1)*(a.p2-a.p1)/((a.p1-a.p2).len()));}
    // 点是否在直线上
    bool pip_line(vec p,line a){return dis_line(p,a)<eps;}
    // 两线段是否相交
    bool cross(line a,line b){
        ld t1=(a.p2-a.p1)*(b.p1-a.p1),t2=(a.p2-a.p1)*(b.p2-a.p1);
        ld t3=(b.p2-b.p1)*(a.p1-b.p1),t4=(b.p2-b.p1)*(a.p2-b.p1);
        return (t1*t2<eps)&(t3*t4<eps);
    }
    // 两直线交点
    vec p_cross(line a,line b){
        vec x=a.p2-a.p1,y=b.p2-b.p1,z=a.p1-b.p1;
        return a.p1+x*((y*z)/(x*y));
    }
    bool cmp(vec a,vec b){
        if(a.x==b.x) return a.y<b.y;
        else return a.x<b.x;
    }
    // 二维凸包
    void Convex(vec in[],vec out[],int &cnt){
        int stk[N],top=0;bool vis[N];
        sort(in+1,in+1+cnt,cmp);
        stk[top=1]=1;
        for(int i=2;i<=cnt;i++){
            while(top>=2&&(in[i]-in[stk[top]])*(in[stk[top]]-in[stk[top-1]])<eps) vis[stk[top--]]=false;
            vis[i]=true;stk[++top]=i;
        }
        int siz=top;
        for(int i=cnt-1;i>=1;i--){
            if(vis[i]) continue;
            while(top>siz&&(in[i]-in[stk[top]])*(in[stk[top]]-in[stk[top-1]])<eps) vis[stk[top--]]=false;
            vis[i]=true;stk[++top]=i;
        }
        for(int i=1;i<=top;i++) out[i]=in[stk[i]]; cnt=top;
    }
}
using namespace ComputationGeometry;

标签:ld,return,top,stk,vec,计算,几何,operator,模板
From: https://www.cnblogs.com/Rolling-star/p/17615014.html

相关文章

  • 【学习笔记】【数学】计算几何基础
    点击查看目录目录前置知识:叉积与跨立实验前置知识:建议虽然是简单的前置知识,还是打开略过一遍。浮点数与误差分析(少用除法)向量相关向量向量,就是带有方向和大小两个属性的边,通常形式为\(\overrightarrow{AB}=(a_1,a_2)=A\)。运算与性质:判等:两点坐标重合。ilint......
  • 【计算机网络】WebSocket 是什么原理?为什么可以实现持久连接?
    一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接),循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的......
  • 计算几何の板子
    一精度处理\(eps\)和\(sgn\)constdoubleeps=1e-8;intsgn(doublex){//判断大小if(fabs(x)<eps)return0;elsereturnx<0?-1:1;}二点1点的初始化向量的表示形式上与点完全相同重载点运算符,支持向量的四种运算structPoint{doublex,y;Poi......
  • 凸优化9——强对偶条件、几何解释、影子价格
    中科大-凸优化笔记(lec31)-Lagrange对偶(三)_及时行樂_的博客-CSDN博客中科大-凸优化笔记(lec32)-几种解释_及时行樂_的博客-CSDN博客关于Slater条件的证明有点难,我觉得暂时先记住就好此外我关注了一下影子价格这个东西什么是影子价格?——线性规划的对偶解,及拉格朗日乘数-知乎(......
  • Django博客开发教程:体验django模板
    上面我们有说过,用户发送请求的时候,视图会返回一个响应,响应可以是一个重定向,一个404错误,一个XML文档,一张图片或者是一个HTML内容的网页。前面几个返回的信息比较有限,我们重点更多是放在HTML内容的网页。我们把这样的页面按规范写好,然后都放在项目根目录下的templates文件夹里,这样的......
  • Django博客开发教程:体验django模板,
    上面我们有说过,用户发送请求的时候,视图会返回一个响应,响应可以是一个重定向,一个404错误,一个XML文档,一张图片或者是一个HTML内容的网页。前面几个返回的信息比较有限,我们重点更多是放在HTML内容的网页。我们把这样的页面按规范写好,然后都放在项目根目录下的templates文件夹里,这样的......
  • ASP.NET Core 中的显示和编辑器模板
    显示模板和编辑器模板指定了自定义类型的用户界面布局。考虑下列 Address 模型:C#复制 publicclassAddress{publicintId{get;set;}publicstringFirstName{get;set;}=null!;publicstringMiddleName{get;set;}=null!;publicst......
  • 复习笔记|《计算机组成原理》
    参考教材:《计算机组成原理》蒋本珊➢前2类题看书中和课件中的有关概念。➢第3、4、5类题请注意平时的作业。如:❑扩展操作码设计❑有效地址的计算❑定点数乘、除运算❑存储器设计❑Cache计算❑微指令操作控制字段的设计第一章➢存储程序概念计算机硬件的组成,存储器控......
  • sql 递减计算
    CREATETABLE#temp(qtyINT,qty1INT,qty2INT);INSERTINTO#temp(qty,qty1,qty2)VALUES(7000,0,0),(6000,0,0),(5000,0,0),(4000,0,0);DECLARE@pINT=15000;UPDAT......
  • 1-3 多态、模板
    1多态多态分两类:静态多态:函数重载和运算符重载,即复用函数名动态多态:派生类和虚函数来实现运行时多态区别:静态多态在编译阶段确定函数地址动态多态在运行阶段确定函数地址,根据传入的对象不同确定具体的执行函数动态多态满足条件:首先要有继承关系子类要重写父类的虚......