ACdream 1106 游泳水平有限的瑶瑶 (计算几何)(点到直线的最短距离)
2017-06-21 20:41
561 查看
题目链接:
ACdream 1106
题意:
给你两个凸多边形,求这两个凸多边形的最短距离。
题解:
就是让你求点到直线的最短距离。
AC代码:
ACdream 1106
题意:
给你两个凸多边形,求这两个凸多边形的最短距离。
题解:
就是让你求点到直线的最短距离。
AC代码:
/* * this code is made by LzyRapx * Problem: 1106 * Verdict: Accepted * Submission Date: 2017-06-21 20:11:16 * Time: 4MS * Memory: 3244KB */ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 5e6+10; const int N=50000; const double eps=1e-9; const double INF=1e99; struct Point { double x,y; }; Point P ,Q ; //点积 double cross(Point A,Point B,Point C) { return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x); } double dist(Point A,Point B) { return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); } //叉积 double multi(Point A,Point B,Point C) { return (B.x-A.x)*(C.x-A.x)+(B.y-A.y)*(C.y-A.y); } //顺时针排序 void anticlockwise(Point p[],int n) { for(int i=0;i<n-2;i++) { double tmp=cross(p[i],p[i+1],p[i+2]); if(tmp>eps) return; else if(tmp<-eps) { reverse(p,p+n); return; } } } //计算C点到直线AB的最短距离 double Getdist(Point A,Point B,Point C) { if(dist(A,B)<eps) return dist(B,C); if(multi(A,B,C)<-eps) return dist(A,C); if(multi(B,A,C)<-eps) return dist(B,C); return fabs(cross(A,B,C)/dist(A,B)); } //求一条直线的两端点到另外一条直线的距离,反过来一样,共4种情况 double MinDist(Point A,Point B,Point C,Point D) { return min( min(Getdist(A,B,C), Getdist(A,B,D)), min( Getdist(C,D,A), Getdist(C,D,B))); } double solve(Point P[],Point Q[],int n,int m) { int yminP=0,ymaxQ=0; for(int i=0;i<n;i++) { if(P[i].y < P[yminP].y) { yminP = i; } } for(int i=0;i<m;i++) { if(Q[i].y > Q[ymaxQ].y) { ymaxQ = i; } } P =P[0]; Q[m]=Q[0]; double tmp,ans=INF; for(int i = 0; i < n; i++) { while(tmp = cross( P[yminP + 1],Q[ymaxQ + 1],P[yminP]) - cross( P[yminP + 1], Q[ymaxQ], P[yminP] ) > eps ) { ymaxQ = (ymaxQ + 1)%m; } if(tmp < -eps) { ans=min(ans,Getdist( P[yminP],P[yminP + 1],Q[ymaxQ] ) ); } else { ans=min(ans,MinDist(P[yminP],P[yminP + 1],Q[ymaxQ],Q[ymaxQ + 1])); } yminP = (yminP + 1 )%n; } return ans; } int main() { int n,m; cin>>n; for(int i = 0; i < n; i++) { cin >> P[i].x >> P[i].y; } cin >> m; for(int i = 0; i < m ; i++){ cin >> Q[i].x >> Q[i].y; } anticlockwise(P,n);//顺时针排序 anticlockwise(Q,m);//顺时针排序 double ans = min( solve(P,Q,n,m), solve(Q,P,m,n)); printf("%.4f\n",ans); return 0; }
相关文章推荐
- 计算几何模板补充(三维空间体积、平面、直线、向量相关计算。附上hdu4741,求异面直线的最短距离与交点)
- acdreamoj 1106 游泳水平有限的瑶瑶
- 三维空间两直线/线段最短距离、线段计算算法
- BZOJ 1007: [HNOI2008]水平可见直线( 计算几何 )
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
- HDU 4617 Weapon (计算几何:异面直线距离)
- HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
- [BZOJ1007]HNOI2008水平可见直线|计算几何|栈
- hdu 4454 Stealing a Cake(计算几何:最短距离、枚举/三分)
- BZOJ1007 [HNOI2008]水平可见直线 计算几何 单调栈维护上凸包
- [计算几何]POJ3608 求2个不相交凸包的最短距离
- HDU 4617 Weapon(计算几何、三维直线距离)
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
- c 空间点到直线的垂足及距离计算
- HDU 4617 Weapon (简单三维计算几何,异面直线距离)
- Hdu 4617 Weapon (三维计算几何 异面直线距离)
- BZOJ 1007 水平可见直线 | 计算几何
- ACdream 1107 瑶瑶迷上新游戏 (计算几何+确认抛物线)
- 【codeforces 672 C】【计算几何+贪心】Recycling Bottles【有两个人和一个垃圾桶,n个瓶子,把每个瓶子捡起来然后扔到垃圾箱中,每人最多带一个瓶子,求最短总距离】
- bzoj 1007: [HNOI2008]水平可见直线(计算几何)