la3890(半平面交)

蓝书半平面交例题

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=150;
const double eps=1e-12;
int n;
struct vec{
    double x,y;
    vec(double x=0,double y=0):x(x),y(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);
    }
}po[maxn],v[maxn],v2[maxn],g[maxn];
vec operator*(vec a,double t){return vec(a.x*t,a.y*t);}
double cross(vec a,vec b){return a.x*b.y-b.x*a.y;}
struct lin{
    vec p,v;
    double ang;
    lin(){}
    lin(vec p,vec v):p(p),v(v){ang=atan2(v.y,v.x);}
    bool operator<(const lin&a)const{
        return ang<a.ang;
    }
}ll[maxn],q[maxn];
bool onl(lin L,vec p){
    return cross(L.v,p-L.p)>0;
}
vec qj(lin a,lin b){
    vec u=a.p-b.p;
    double t=cross(b.v,u)/cross(a.v,b.v);
    return a.v*t+a.p;
}
vec nor(vec a){
    double len=sqrt(a.x*a.x+a.y*a.y);
    return vec(-a.y/len,a.x/len);
}
int halfj(){
    sort(ll,ll+n);
    int head,tail;
    q[head=tail=0]=ll[0];
    for(int i=1;i<n;++i){
        while(head<tail&&!onl(ll[i],g[tail-1]))tail--;
        while(head<tail&&!onl(ll[i],g[head]))head++;
        q[++tail]=ll[i];
        if(fabs(cross(q[tail].v,q[tail-1].v))<eps){
            --tail;if(onl(q[tail],ll[i].p))q[tail]=ll[i];
        }
        if(head<tail)g[tail-1]=qj(q[tail-1],q[tail]);
    }
    while(head<tail&&!onl(q[head],g[tail-1]))--tail;
    if(tail-head<=1)return 0;
    return 1;
}
int main(){
    while(scanf("%d",&n)==1&&n){
        int m,x,y;
        for(int i=0;i<n;++i){
            scanf("%d%d",&x,&y);po[i]=vec(x,y);
        }
        for(int i=0;i<n;++i){v[i]=po[(i+1)%n]-po[i];v2[i]=nor(v[i]);}
        double l=0,r=20000,mid;
        while(r-l>1e-6){
            mid=(l+r)/2;
            for(int i=0;i<n;++i)ll[i]=lin(v2[i]*mid+po[i],v[i]);//这里必须先写乘法再写加法才能过编译,可能是我这种重定义的问题;
            if(halfj())l=mid;else r=mid;
        }
        printf("%.6lf\n",l);
    }
    system("pause");
    return 0;
}
/*
4
0 0
10000 0
10000 10000
0 10000
3
0 0
10000 0
7000 1000
6
0 40
100 20
250 40
250 70
100 90
0 70
3
0 0
10000 10000
5000 5001
0
*/

 

转载于:https://www.cnblogs.com/dibaotianxing/p/8365252.html

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值