日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算几何 模板

發(fā)布時(shí)間:2024/9/5 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算几何 模板 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//凸包+最遠(yuǎn)點(diǎn)對 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> using namespace std; const double eps = 1e-8;int cmp(double x) {if(fabs(x)<eps)return 0;if(x>0)return 1;return -1; }inline double sqr(double x) {return x*x; }struct point {double x,y;point(){}point(int xx,int yy){x=xx;y=yy;}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 bool operator == (const point &a,const point &b){return cmp(a.x-b.x)==0 && cmp(a.y-b.y)==0;}void input(){scanf("%lf%lf",&x,&y);}double norm(){return sqrt(sqr(x)+sqr(y));} }; struct polygon_convex {vector<point>P;polygon_convex(int Size=0){P.resize(Size);}};bool comp_less(const point &a,const point &b) {return cmp(a.x-b.x)<0 || (cmp(a.x-b.x==0) && cmp(a.y-b.y)<0); }double det(point a,point b) {return a.x*b.y-a.y*b.x; } double dist(const point &a,const point &b) {return (a-b).norm(); } long long dd(const point &a,const point &b) {return sqr(a.x-b.x)+sqr(a.y-b.y); } polygon_convex convex_hull(vector<point> a) {polygon_convex res(2*a.size()+5);sort(a.begin(),a.end(),comp_less);a.erase(unique(a.begin(),a.end()),a.end());int m=0;for(int i=0;i<a.size();++i){while(m>1&&cmp(det( res.P[m-1]-res.P[m-2],a[i]-res.P[m-2] ))<=0)--m;res.P[m++]=a[i];}int k=m;for(int i=int(a.size())-2;i>=0;--i){while(m>k && cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0)--m;res.P[m++]=a[i];}res.P.resize(m);if(a.size()>1)res.P.resize(m-1);return res; }long long convex_diameter(polygon_convex &a,int &First,int &Second) {vector<point> &p = a.P;int n=p.size();long long maxd=0;if(n==1){First=Second=0;return maxd;}#define next(i) ((i+1)%n)for(int i=0,j=1;i<n;i++){while(cmp(det(p[next(i)]-p[i],p[j]-p[i])-det(p[next(i)]-p[i],p[next(j)]-p[i]))<0){j=next(j);}long long d=dd(p[i],p[j]);if(d>maxd){maxd=d;First=i,Second=j;}d=dd(p[next(i)],p[next(j)]);if(d>maxd){maxd=d;First=i,Second=j;}}return maxd; } int n; vector<point> p; polygon_convex pc; point pp; int main() {scanf("%d",&n);for(int i=1;i<=n;i++){pp.input();p.push_back(pp);}int x,y;pc = convex_hull(p);long long dis = convex_diameter(pc,x,y);cout<<dis; }


?

//圓與多邊形面積交 #include<iostream> #include<cmath> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; const int Max = 1011; const double PI =acos(-1.0); const double pi =acos(-1.0);double ax,ay,bx,by,K; double cx,cy,tx,ty,R; int n;const double eps=1e-8; int cmp(double x) {if(fabs(x)<eps)return 0;if(x>0)return 1;return -1; } inline double sqr(double x) {return x*x; }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 bool operator ==(const point &a,const point &b){return (cmp(a.x-b.x)==0)&&(cmp(a.y-b.y)==0);}friend point operator *(const point &a,const double &b){return point(a.x*b,a.y*b);}friend point operator *(const double &a,const point &b){return point(a*b.x,a*b.y);}friend point operator /(const point &a,const double &b){return point(a.x/b,a.y/b);}double norm(){return sqrt(x*x+y*y);} };double det(const point &a,const point &b) {return a.x*b.y-a.y*b.x; } double dot(const point &a,const point &b) {return a.x*b.x+a.y*b.y; } double dist(const point &a,const point &b) {return (a-b).norm(); } point rotate_point(const point &a,const double A) {double tx=a.x,ty=a.y;return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A)); }int dcmp(double k){return k<-eps?-1:k>eps?1:0; }double cross(const point &a,const point &b){return a.x*b.y-a.y*b.x; } double abs(const point &o){return sqrt(dot(o,o)); } point crosspt(const point &a,const point &b,const point &p,const point &q){double a1=cross(b-a,p-a);double a2=cross(b-a,q-a);return (p*a2-q*a1)/(a2-a1); } point res[Max]; double r; double mysqrt(double n){return sqrt(max(0.0,n)); } void circle_cross_line(const point &a,const point &b,const point &o,double r,point ret[],int &num) {double x0=o.x,y0=o.y;double x1=a.x,y1=a.y;double x2=b.x,y2=b.y;double dx=x2-x1,dy=y2-y1;double A=dx*dx+dy*dy;double B=2*dx*(x1-x0)+2*dy*(y1-y0);double C=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)-r*r;double delta=B*B-4*A*C;num=0;if(dcmp(delta)>=0){double t1=(-B-mysqrt(delta))/(2*A);double t2=(-B+mysqrt(delta))/(2*A);if(dcmp(t1-1)<=0&&dcmp(t1)>=0) ret[num++]=point(x1+t1*dx,y1+t1*dy);if(dcmp(t2-1)<=0&&dcmp(t2)>=0) ret[num++]=point(x1+t2*dx,y1+t2*dy);} }double sector_area(const point &a,const point &b){double theta=atan2(a.y,a.x)-atan2(b.y,b.x);while(theta<=0) theta+=2*PI;while(theta>2*PI) theta-=2*PI;theta=min(theta,2*PI-theta);return r*r*theta/2; } double calc(const point &a,const point &b){point p[2];int num =0;int ina=dcmp(abs(a)-r)<0;int inb=dcmp(abs(b)-r)<0;if(ina){if(inb){return fabs(cross(a,b))/2.0;}else{circle_cross_line(a,b,point(0,0),r,p,num);return sector_area(b,p[0])+fabs(cross(a,p[0]))/2.0;}}else{if(inb){circle_cross_line(a,b,point(0,0),r,p,num);return sector_area(p[0],a)+fabs(cross(p[0],b))/2.0;}else{circle_cross_line(a,b,point(0,0),r,p,num);//cout<<"num="<<num<<endl;if(num==2){//cout<<"num=2"<<endl;return sector_area(a,p[0])+sector_area(p[1],b)+fabs(cross(p[0],p[1]))/2.0;}else{//cout<<" not in "<<a.x<<" "<<a.y<<" "<<b.x<<" "<<b.y<<endl;return sector_area(a,b);}}} } double area(){double ret=0;for(int i=0;i<n;i++){int sgn=dcmp(cross(res[i],res[i+1]));if(sgn!=0){ret+=sgn*calc(res[i],res[i+1]);//cout<<"sgn="<<sgn<<" calc="<<calc(res[i],res[i+1])<<endl;//cout<<"point "<<res[i].x<<" "<<res[i].y<<" "<<res[i+1].x<<" "<<res[i+1].y<<endl;//cout<<"ret="<<ret<<endl;}}return ret; }int main() {int it=0;while(scanf("%d",&n)==1){it++;//cout<<"PI="<<PI<<endl;scanf("%lf",&K);//K=1/K;for(int i=0;i<n;i++)scanf("%lf%lf",&res[i].x,&res[i].y);res[n].x=res[0].x;res[n].y=res[0].y;scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);tx=ax+(bx-ax)/(1+K);ty=ay+(by-ay)/(1+K);cx=ax+(bx-ax)+(bx-ax)*K/(1-K);cy=ay+(by-ay)+(by-ay)*K/(1-K);cx=(cx+tx)/2;cy=(cy+ty)/2;R=sqrt((tx-cx)*(tx-cx)+(ty-cy)*(ty-cy));r=R;for(int i=0;i<=n;i++){res[i].x-=cx;res[i].y-=cy;//cout<<"res["<<i<<"].x="<<res[i].x<<endl;//cout<<"res["<<i<<"].y="<<res[i].y<<endl;}printf("Case %d: %.8f\n",it,fabs(area()));} }


?

轉(zhuǎn)載于:https://www.cnblogs.com/abgnwl/p/6550340.html

總結(jié)

以上是生活随笔為你收集整理的计算几何 模板的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。