警示后人
查看原帖
警示后人
239167
Ptilopsis_w楼主2023/1/7 15:25

如果你 WA 了:

有可能是求闵可夫斯基和的时候,出现了共线且方向相反的边,此时两向量的叉积为 00,需要特判一下,把 y>=0y>=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 // s1[i], s2[j] 共线
    {
        if(abs(angle(s1[i])-angle(s2[j])) <= 1e-5)// angle(s1[i]) 是 atan2(y, x) 求出来的这个向量的角度
            S[cnt] = S[cnt-1]+s1[i++]; // 如果角度一样就随便挑一个
        else if(s1[i].y >= 0)
            S[cnt] = S[cnt-1]+s1[i++]; // 否则先选 y >= 0 的
        else
            S[cnt] = S[cnt-1]+s2[j++];
     }
}
2023/1/7 15:25
加载中...