C++ 凸包码;竞争性编程1“;

C++ 凸包码;竞争性编程1“;,c++,convex-hull,C++,Convex Hull,我试图理解Steven Halim和Felix Halim的《竞争编程》一书中的“凸包”算法。“凸包”问题是,给定平面上n个点的集合P,找到构成包含所有其他点的凸多边形顶点的子集CH(P)。下面是一张概述他们方法的图片: 他们的算法首先根据点相对于“枢轴”的角度对点进行排序,即p中最底部和最右侧的点 我在理解他们的angle\u comp功能时遇到了一些问题-它的作用和用途是什么。有人能帮我理解吗 typedef struct { double x, y ; } point; poi

我试图理解Steven Halim和Felix Halim的《竞争编程》一书中的“凸包”算法。“凸包”问题是,给定平面上n个点的集合P,找到构成包含所有其他点的凸多边形顶点的子集CH(P)。下面是一张概述他们方法的图片:

他们的算法首先根据点相对于“枢轴”的角度对点进行排序,即p中最底部和最右侧的点

我在理解他们的
angle\u comp
功能时遇到了一些问题-它的作用和用途是什么。有人能帮我理解吗

typedef struct {
    double x, y ;
} point;

point pivot;

// A function to compute the distance between two points:
double dist2 (point a, point b) 
{
    double dx = a.x - b.x ;
    double dy = a.y - b.y ;
    return sqrt (dx *dx + dy * dy) ;
}

// A function to compare the angles of two points with respect to the pivot:
bool angle_comp (point a, point b)
{
    if (fabs(area2(pivot, a, b) - 0) < 10e-9)
        return dist2(pivot, a) < dist2(pivot, b);

    int d1x = a.x - pivot.x, d1y = a.y - pivot.y;
    int d2x = b.x - pivot.x, d2y = b.y - pivot.y; 
    return (atan2((double) d1y, (double) d1x)
               - atan2 ((double) d2y, (double)d2x))
             < 0;
}
typedef结构{
双x,y;
}点;
点支点;
//用于计算两点之间距离的函数:
双距离2(点a、点b)
{
双dx=a.x-b.x;
双dy=a.y-b.y;
返回sqrt(dx*dx+dy*dy);
}
//用于比较两点相对于枢轴的角度的函数:
布尔角补偿(点a、点b)
{
if(晶圆厂(区域2(枢轴,a,b)-0)<10e-9)
返回距离2(枢轴,a)
如果我正确理解了您的问题,您想知道为什么排序功能很重要吗?这是因为你的代码使用了格雷厄姆扫描法,一种寻找凸包的方法。为了使格雷厄姆扫描更有效,这些点必须按照它们相对于固定点的角度进行排序

angle_comp
功能比较两点A和B相对于枢轴点的角度。当插入
std::sort
时,此功能允许我们根据枢轴周围的所有点相对于枢轴的角度或距离对其进行排序

对于围绕枢轴的两点A和B。如果点A和点B具有相同的角度,或者如果另一个点都靠近轴,那么我们需要另一种方法对这两个点进行排序。我们根据点与轴的距离对点进行排序

否则,我们将找出A点和B点相对于枢轴的位置。我们通过从点中减去枢轴来实现这一点。例如,如果我们的轴是(4,3),A是(5,7),那么A是1个单位的右边,离轴4个单位。如果我们的轴心是(0,0),那么A将是(1,4)。希望这是可以理解的

在得到相对点D之后,我们计算该点相对于枢轴或原点的角度
atan2
采用两个参数,点的y值和x值,并以弧度表示点的角度。对于
atan2
,0弧度定义为远离原点的任何点(N,0),并且随着弧度的增加,该点围绕枢轴或原点逆时针移动

然后从D2的角度减去D的角度。如果D2的角度大于D1的角度,我们返回true,并且
std::sort
可以使用返回的数据逆时针排序角度