次のコードスニペットはhereから取得しました。この問題の解決策はHDU 2823です。HDUのソリューションを理解できません。2823
#define eps 1e-9
double rc(point pp[],point qq[],int n,int m)
{
int q=0;
int p=0;
for(int i=0;i<n;i++)
if(pp[i].y-pp[p].y<-eps)
p=i;
for(int i=0;i<m;i++)
if(qq[i].y-qq[q].y>eps)
q=i;
pp[n]=pp[0];
qq[m]=qq[0];
double tmp,ans=1e99;
for(int i=0;i<n;i++)
{
while((tmp=cross(pp[p+1],qq[q+1],pp[p])-cross(pp[p+1],qq[q],pp[p]))>eps)
q=(q+1)%m;
if(tmp<-eps)
ans=min(ans,dist_p_to_seg(qq[q],pp[p],pp[p+1]));
else
ans=min(ans,dist_seg_to_seg(pp[p],pp[p+1],qq[q],qq[q+1]));
p=(p+1)%n;
}
return ans;
}
pp[]
とqq[]
は、二つの異なる凸包です。 p
はpp
凸包の最高点であり、q
はqq
凸包の最低点です。
私は、この行を理解するように見えることはできません。
while((tmp=cross(pp[p+1],qq[q+1],pp[p])-cross(pp[p+1],qq[q],pp[p]))>eps)
q=(q+1)%m;
彼が達成しようとしていますか?
は注意してください。たとえば、 'eps'の値は、その使用方法と同様に非常に重要です。あなたは "イプシロン値"の一般的な使用に精通していますか? – usr2564301
Woh!私は数学が好きですが、そのような長い文字列にあるときはありません:) –