l=2,r=2,t=2; for(int i=1;i<=m;i++){ while(sqr(s[i],s[i+1],s[t%m+1])>=sqr(s[i],s[i+1],s[t]))t=t%m+1; while(dot(s[i],s[i+1],s[i+1],s[r%m+1])>=dot(s[i],s[i+1],s[i+1],s[r]))r=r%m+1; if(i==1)l=r; while(dot(s[i+1],s[i],s[i],s[l%m+1])>=dot(s[i+1],s[i],s[i],s[l]))l=l%m+1; double res= ( dist(s[i],s[i+1]) +dot(s[i],s[i+1],s[i+1],s[r])/dist(s[i],s[i+1]) +dot(s[i+1],s[i],s[i],s[l])/dist(s[i],s[i+1]) )*sqr(s[i],s[i+1],s[t])/dist(s[i],s[i+1]); if(res<ans){ ans=res; I=i;L=l;R=r;T=t; } } printf("%.5f\n",ans); Point W[4]={}; double len=dist(s[I],s[I+1]); Vector dir=(s[I+1]-s[I])*(1.0/len); W[0]=s[I]+dir*dot(dir,s[R]-s[I]); W[3]=s[I]+dir*dot(dir,s[L]-s[I]); Vector norm={-dir.y,dir.x}; double len2=sqr(s[I],s[I+1],s[T])/len; W[1]=W[0]+norm*len2; W[2]=W[3]+norm*len2; for(int i=0;i<4;i++){ printf("%.5f %.5f\n",W[i].x,W[i].y); }
|