1

私は凸多角形の直径、つまりそれらの間に最大距離を持つ点のペアを見つける問題を解決しようとしています。

http://cgm.cs.mcgill.ca/~orm/diam.html

ここに記載されているアルゴリズム/擬似コードを実装しようとしました。しかし、これらの点を使用して作成されたポリゴンの答えが間違っています(-3、-4)(2、-3)(4,3)(0,5)

明らかに、ポリゴンの直径は(-3、-4)(4,3)です。しかし、ここで言及されている擬似コードによれば、直径は(-3、-4)(0,5)として得られます。

struct vert
{
    long long int x,y,idx;
    double rad;
    int next;
    vert()
    {}
    vert(long long int _x,long long int _y)
    {
        x=_x;
        y=_y;
        rad=atan2(double(y),double(x));
    }
};
long long int dist(vert a,vert b)
{
    vert ab=b-a;
    return (ab.x*ab.x+ab.y*ab.y);
}
int cross(vert a,vert b,vert c)
{
    vert ab,ac;
    ab=b-a;
    ac=c-a;
    return ab.x*ac.y-ab.y*ac.x;
}
double area(vert a,vert b,vert c)
{
    double x=cross(a,b,c);
    x=abs(x/2.00);
    return x;
}
struct ret
{
    vert a,b;
    double dist;
};
ret comp(ret ans,vert a,vert b)
{
    if(dist(a,b)>ans.dist)
    {
        ans.a=a;
        ans.b=b;
        ans.dist=dist(a,b);
    }
    return ans;
}

ret rc_diameter(vector<vert> &v)
{
    int i,j,k,l,n;
    n=v.size();
    int a,b;
    int p,q,p0,q0;
    p0=p=0;
    q=1;
    ret ans;
    ans.dist=0;
    while(area(v[p],v[v[p].next],v[v[q].next])>area(v[p],v[v[p].next],v[q]))
    {
        q=v[q].next;
    }
    q0=q;
    ans=comp(ans,v[p],v[q]);
    while(q!=p0)
    {
        p=v[p].next;
        ans=comp(ans,v[p],v[q]);
        while(area(v[p],v[v[p].next],v[v[q].next])>area(v[p],v[v[p].next],v[q]))
        {
            q=v[q].next;
            if(p!=q0&&q!=p0)
                ans=comp(ans,v[p],v[q]);
            else
                return ans;
        }
        if(area(v[p],v[v[p].next],v[v[q].next])==area(v[p],v[v[p].next],v[q]))
        {
            if(p!=q0&&q!=p0)
                ans=comp(ans,v[p],v[v[q].next]);
            else
                ans=comp(ans,v[v[p].next],v[q]);
        }
    }
    return ans;
}

したがって、擬似コードまたは実装に問題があるかどうかを教えてくれる場合は、このアルゴリズムを特定のポイントのセットに手動で適用したときにも、(-3、-4)(0,5)を取得しています。直径。

4

1 に答える 1