Следующий фрагмент кода был взят из 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! Мне нравится математика, но не тогда, когда она в таких длинных строках :) –