[模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算

类型定义


typedef double db;

const db eps=1e-8,pi=acos(-1);
il int dcmp(db a){return fabs(a)<=eps?0:a>0;}
il db p2(db v){return v*v;}
il db gougu1(db a,db b){return sqrt(p2(a)+p2(b));}
il db gougu2(db a,db b){return sqrt(p2(a)-p2(b));}
il db rand01(){return rand()/(db)RAND_MAX;}

//p:point l:line s:segment
struct tvec{db x,y;};
struct tline{tvec p,v;};
struct tseg{tvec x,y;};
struct tcir{tvec o;db r};

ostream& operator<<(ostream &os,tvec a){os<<"("<<a.x<<", "<<a.y<<")";return os;}
ostream& operator<<(ostream &os,tline a){os<<"<"<<a.p<<", "<<a.v<<">";return os;}
ostream& operator<<(ostream &os,tseg a){os<<"<"<<a.x<<", "<<a.y<<">";return os;}
ostream& operator<<(ostream &os,tcir a){os<<"<"<<a.o<<", r="<<a.r<<">";return os;}

void shake(tvec &a){a.x+=(rand01()-0.5)*eps*10;a.y+=(rand01()-0.5)*eps*10;}//??
il tvec operator+(tvec a,tvec b){return (tvec){a.x+b.x,a.y+b.y};}
il tvec operator-(tvec a,tvec b){return (tvec){a.x-b.x,a.y-b.y};}
il tvec operator*(tvec a,db b){return (tvec){a.x*b,a.y*b};}
il tvec operator*(db a,tvec b){return b*a;}
il db operator*(tvec a,tvec b){return a.x*b.y-b.x*a.y;}
il db operator^(tvec a,tvec b){return a.x*b.x+a.y*b.y;}
il tvec norm(tvec a){return (tvec){-a.y,a.x};}
il tvec rotate(tvec a,db alp){db s=sin(alp),c=cos(alp);return (tvec){c*a.x-s*a.y,s*a.x+c*a.y};}
il tvec rotate(tvec a,db s,db c){return (tvec){c*a.x-s*a.y,s*a.x+c*a.y};}
il db len(tvec a){return gougu1(a.x,a.y);}
il db ang(tvec a){return atan2(a.y,a.x);}
il db ang(tvec a,tvec b){return (a^b)/(len(a)*len(b));}//cos<a,b>
il bool para(tvec a,tvec b){return dcmp(a*b)==0;}
il bool perp(tvec a,tvec b){return dcmp(a^b)==0;}

算法

向量, 直线, 线段

点到直线距离, 对称点, 点在线段上
il db dist(tvec b,tline a){return (a.v*(b-a.p))/len(a.v);}
il tvec symm(tvec a,tline b){return a-norm(b.v)*(dist(a,b)*2/len(b.v));}
il bool onseg(tseg a,tvec b){return dcmp((a.x-b)^(b.x-b))==0&&dcmp((a.x-b)*(b.x-b))<0;}
判断线段相交
il bool isinters_ss(tseg a,tseg b){ //strict
    return dcmp(((a.y-b.x)*(b.y-b.x))*((a.x-b.x)*(b.y-b.x)))<0
        && dcmp(((b.x-a.x)*(a.y-a.x))*((b.y-a.x)*(a.y-a.x)))<0;
}
直线交点
il tvec inters(tline a,tline b){db v=(b.v*(a.p-b.p))/(a.v*b.v);return a.p+a.v*v;}

多边形

面积
db getarea(){
    if(ppo==0)return 0;
    db res=poly[ppo]*poly[1];
    rep(i,1,ppo-1)
        res+=poly[i]*poly[i+1];
    return res/2.0;
}

还没写完...

所有的代码


typedef double db;

const db eps=1e-8,pi=acos(-1);
il int dcmp(db a){return fabs(a)<=eps?0:a>0;}
il db p2(db v){return v*v;}
il db gougu1(db a,db b){return sqrt(p2(a)+p2(b));}
il db gougu2(db a,db b){return sqrt(p2(a)-p2(b));}
il db rand01(){return rand()/(db)RAND_MAX;}

//p:point l:line s:segment
struct tvec{db x,y;};
struct tline{tvec p,v;};
struct tseg{tvec x,y;};
struct tcir{tvec o;db r};

ostream& operator<<(ostream &os,tvec a){os<<"("<<a.x<<", "<<a.y<<")";return os;}
ostream& operator<<(ostream &os,tline a){os<<"<"<<a.p<<", "<<a.v<<">";return os;}
ostream& operator<<(ostream &os,tseg a){os<<"<"<<a.x<<", "<<a.y<<">";return os;}
ostream& operator<<(ostream &os,tcir a){os<<"<"<<a.o<<", r="<<a.r<<">";return os;}

void shake(tvec &a){a.x+=(rand01()-0.5)*eps*10;a.y+=(rand01()-0.5)*eps*10;}//??
il tvec operator+(tvec a,tvec b){return (tvec){a.x+b.x,a.y+b.y};}
il tvec operator-(tvec a,tvec b){return (tvec){a.x-b.x,a.y-b.y};}
il tvec operator*(tvec a,db b){return (tvec){a.x*b,a.y*b};}
il tvec operator*(db a,tvec b){return b*a;}
il db operator*(tvec a,tvec b){return a.x*b.y-b.x*a.y;}
il db operator^(tvec a,tvec b){return a.x*b.x+a.y*b.y;}
il tvec norm(tvec a){return (tvec){-a.y,a.x};}
il tvec rotate(tvec a,db alp){db s=sin(alp),c=cos(alp);return (tvec){c*a.x-s*a.y,s*a.x+c*a.y};}
il tvec rotate(tvec a,db s,db c){return (tvec){c*a.x-s*a.y,s*a.x+c*a.y};}
il db len(tvec a){return gougu1(a.x,a.y);}
il db ang(tvec a){return atan2(a.y,a.x);}
il db ang(tvec a,tvec b){return (a^b)/(len(a)*len(b));}//cos<a,b>
il bool para(tvec a,tvec b){return dcmp(a*b)==0;}
il bool perp(tvec a,tvec b){return dcmp(a^b)==0;}


il db dist(tvec b,tline a){return (a.v*(b-a.p))/len(a.v);}
il tvec symm(tvec a,tline b){return a-norm(b.v)*(dist(a,b)*2/len(b.v));}
il tvec inters(tline a,tline b){db v=(b.v*(a.p-b.p))/(a.v*b.v);return a.p+a.v*v;}
il bool isinters_ss(tseg a,tseg b){ //strict
    return dcmp(((a.y-b.x)*(b.y-b.x))*((a.x-b.x)*(b.y-b.x)))<0
        && dcmp(((b.x-a.x)*(a.y-a.x))*((b.y-a.x)*(a.y-a.x)))<0;
}
il bool onseg(tseg a,tvec b){return dcmp((a.x-b)^(b.x-b))==0&&dcmp((a.x-b)*(b.x-b))<0;}

-1 same, 0 in, 1 out, 2 inscribe 3 cirsumscribe 4 intersect
//il int inters(tcir a,tcir b,vector<tvec> *res){
//  if(a.r<b.r)swap(a,b);
//  db d=len(a.o-b.o),d1=a.r-b.r,d2=a.r+b.r;
//  res->clear();
//  if(dcmp(d)==0&&dcmp(d1)==0)return -1;
//  if(dcmp(d-d1)<0)return 1;
//  if(d>d2)return 0;
//  if(d==d1||d==d2){
//      res->push_back(a.o+(b.o-a.o)*(a.r/d));
//      return (d==d1)?1:2;
//  }
//  
//}

void test(){
    tline a{{1,1},{2,1}},c{{2,1},{-1,1}};
    tvec b{3,4},d{4.6,0.8};
//  cout<<dist(b,a)<<'\n'<<symm(d,a)<<'\n';
    cout<<inters(a,c)<<'\n';
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    test();
    return 0;
}

转载于:https://www.cnblogs.com/ubospica/p/10121673.html

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的家教平台系统。该系统旨在为家教和学生提供一个便捷、高效的在线交流和预约平台,涵盖了从用户注册登录、个人信息管理、课程发布与搜索、预约与取消预约、评价反馈等一系列功能。 在后台管理方面,系统提供了管理员对用户信息、课程信息、预约记录等进行管理的功能,确保平台的正常运行和数据的准确性。通过Spring框架的依赖注入和AOP特性,实现了业务逻辑的清晰分离和高效处理;SpringMVC则负责处理前端请求和响应,提供友好的用户界面;MyBatis作为ORM框架,简化了数据库操作,提高了数据访问的效率和安全性。 前端部分采用Vue.js框架,结合Vue Router进行页面路由管理,Axios进行HTTP请求,实现了前后端分离的开发式。Vue.js的组件化开发和响应式数据绑定特性,使得前端页面更加动态和交互性强,提升了用户体验。 数据库设计采用了MySQL,存储了用户信息、课程信息、预约记录等核心数据。通过合理的数据库表结构和索引设计,保证了系统的高效运行和数据的一致性。 该项目不仅适合计算机相关专业的毕设学生参考和学习,也适合Java学习者进行项目实战练习。通过对该项目的深入理解和二次开发,可以实现更多个性化功能,进一步提升技术水平和实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值