如果你 WA 了:
有可能是求闵可夫斯基和的时候,出现了共线且方向相反的边,此时两向量的叉积为 0,需要特判一下,把 y>=0 的向量排到前边去。
就是把求闵可夫斯基和中的
while(1 <= n and j <= m)
{
cnt++;
if(Cross(s1[i], s2[j]) > 0)
S[cnt] = S[cnt-1]+s1[i++];
else
S[cnt] = S[cnt-1]+s2[j++];
改成
while(i <= n and j <= m)
{
cnt++;
if(Cross(s1[i], s2[j]) > 0)
S[cnt] = S[cnt-1]+s1[i++];
else if(Cross(s1[i], s2[j]) < 0)
S[cnt] = S[cnt-1]+s2[j++];
else
{
if(abs(angle(s1[i])-angle(s2[j])) <= 1e-5)
S[cnt] = S[cnt-1]+s1[i++];
else if(s1[i].y >= 0)
S[cnt] = S[cnt-1]+s1[i++];
else
S[cnt] = S[cnt-1]+s2[j++];
}
}