我试图理解 Steven Halim 和 Felix Halim 的书Competitive Programming中的“凸包”算法。“凸包”问题是,给定平面中的n个点的集合P,找到一个子集CH ( P ),它形成包含所有其他点的凸多边形的顶点。这是一张概述他们方法的图片:
他们的算法首先根据它们相对于“枢轴”的角度对点进行排序,即P中的最底部和最右边的点。
我在理解它们的angle_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;
}