Algorithm 使用旋转卡尺的凸多边形的直径

Algorithm 使用旋转卡尺的凸多边形的直径,algorithm,computational-geometry,Algorithm,Computational Geometry,我试图解决的问题是找到一个凸多边形的直径,即一对点之间有最大距离 我已经尝试实现这里提到的算法/伪代码。但是我用这些点得到的多边形的答案是错误的(-3,-4)(2,-3)(4,3)(0,5) 很明显,多边形的直径是(-3,-4)(4,3)。但是根据这里提到的伪代码,我得到的直径是(-3,-4)(0,5) struct vert { 长整型x,y,idx; 双rad; int-next; vert() {} 垂直(长整型x,长整型y) { x=x; y=_y; rad=atan2(双(y),双(

我试图解决的问题是找到一个凸多边形的直径,即一对点之间有最大距离

我已经尝试实现这里提到的算法/伪代码。但是我用这些点得到的多边形的答案是错误的(-3,-4)(2,-3)(4,3)(0,5)

很明显,多边形的直径是(-3,-4)(4,3)。但是根据这里提到的伪代码,我得到的直径是(-3,-4)(0,5)

struct vert
{
长整型x,y,idx;
双rad;
int-next;
vert()
{}
垂直(长整型x,长整型y)
{
x=x;
y=_y;
rad=atan2(双(y),双(x));
}
};
长整数距离(顶点a、顶点b)
{
垂直ab=b-a;
回报率(ab.x*ab.x+ab.y*ab.y);
}
内部交叉(垂直a、垂直b、垂直c)
{
垂直ab,ac;
ab=b-a;
ac=c-a;
返回ab.x*ac.y-ab.y*ac.x;
}
双区(垂直a、垂直b、垂直c)
{
双x=交叉(a、b、c);
x=绝对值(x/2.00);
返回x;
}
结构网
{
垂直a、b;
双区;
};
薪酬福利(薪酬福利、薪酬福利、薪酬福利a、薪酬福利b)
{
if(dist(a,b)>ans.dist)
{
ans.a=a;
ans.b=b;
ans.dist=dist(a,b);
}
返回ans;
}
钢筋混凝土网直径(矢量和v)
{
int i,j,k,l,n;
n=v.大小();
INTA,b;
int p,q,p0,q0;
p0=p=0;
q=1;
ret ans;
ans.dist=0;
而(区域(v[p],v[v[p].next],v[v[q].next])>区域(v[p],v[v[p].next],v[q]))
{
q=v[q]。下一步;
}
q0=q;
ans=comp(ans,v[p],v[q]);
while(q!=p0)
{
p=v[p]。下一步;
ans=comp(ans,v[p],v[q]);
而(区域(v[p],v[v[p].next],v[v[q].next])>区域(v[p],v[v[p].next],v[q]))
{
q=v[q]。下一步;
如果(p!=q0&&q!=p0)
ans=comp(ans,v[p],v[q]);
其他的
返回ans;
}
如果(面积(v[p],v[v[p].next],v[v[q].next])==面积(v[p],v[v[p].next],v[q]))
{
如果(p!=q0&&q!=p0)
ans=comp(ans,v[p],v[v[q].下一步);
其他的
ans=comp(ans,v[v[p].下一步,v[q]);
}
}
返回ans;
}
那么,什么时候可以告诉我伪代码或我的实现中是否存在问题
另外,当我手动将此算法应用于给定的点集时,我仍然得到(-3,-4)(0,5)作为直径。

可能有点晚了,但我发现您的p0初始值不正确。p0应该是列表中的最后一个点(pn),而不是列表中的第一个点(0)。换句话说,p0是多边形P中第一个点的上一个点,P是多边形P中的第一个点,q是P之后的下一个点。

可能有点晚了,但我发现您对p0的初始值不正确。p0应该是列表中的最后一个点(pn),而不是列表中的第一个点(0)。换句话说,p0是多边形P中第一个点的前一个点,P是多边形P中的第一个点,q是P之后的下一个点

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;
}