poj3384---计算几何

来源:互联网 发布:商务印书馆 知乎 编辑:程序博客网 时间:2024/05/29 16:11
//半平面交,然后求凸包对重点#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#define eps 1e-8#define dist(a,b) sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y))#define cross(a,b,c) (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x)#define dot(a,b,c) (b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y)#define delt(a) fabs(a)<eps?0:a>0?1:-1#define N 1005#define inf 1e20using namespace std;struct TPoint{    double x,y;}pt[N],st,mid[N];int n,m,t,end;double radius;bool scan()//输入{for(int i=0;i<n;i++){scanf("%lf%lf",&pt[i].x,&pt[i].y);}return 1;}bool cmp(TPoint a,TPoint b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}bool ncmp(TPoint a,TPoint b){int d1=delt(cross(pt[0],a,b));return d1>0||(d1==0&&dist(pt[0],a)<dist(pt[0],b));}void getmove(TPoint &a,TPoint &b,double r){TPoint ms;ms.x=a.y-b.y,ms.y=b.x-a.x;double k=r/dist(a,b);a.x+=ms.x*k,a.y+=ms.y*k;b.x+=ms.x*k,b.y+=ms.y*k;}void cut(TPoint ans[],TPoint s,TPoint e,int &np){getmove(s,e,radius);double s1,s2;int i,j,d1,d2;for(i=j=0;i<np;i++){s1=cross(ans[i],s,e),s2=cross(ans[i+1],s,e);d1=delt(s1),d2=delt(s2);if(d1>=0) ans[j++]=ans[i];if(d1*d2<0){ans[j].x=(s2*ans[i].x-s1*ans[i+1].x)/(s2-s1);ans[j++].y=(s2*ans[i].y-s1*ans[i+1].y)/(s2-s1);}}ans[j]=ans[0];np=j;}void solve(){sort(pt,pt+n,cmp);sort(pt,pt+n,ncmp);int i,j,k,maxl=0;TPoint ans[N],a,b;pt[n]=pt[0];for(i=0;i<=n;i++) ans[i]=pt[i];for(i=0,m=n;i<n;i++)cut(ans,pt[i],pt[i+1],m);if(m==1) a=b=ans[0];else if(m==2) a=ans[0],b=ans[1];else{double maxl=0,l;for(i=0;i<m;i++){for(j=0;j<m;j++){l=dist(ans[i],ans[j]);if(l-maxl>eps){maxl=l,a=ans[i],b=ans[j];}}}}printf("%.4f %.4f %.4f %.4f\n",a.x,a.y,b.x,b.y);}int main(){    while(scanf("%d%lf",&n,&radius)!=EOF)    {scan();solve();    }    return 0;}


原创粉丝点击