我正在尝试根据相对于中心的角度对列表点进行排序:
我不关心列表从圆圈的什么位置开始,但它需要以循环方式排序。我想使用 qsort 但它需要一个只有 2 个参数的比较函数,而我的比较函数有 3 个(要比较的中心和两个点):
int compareByAngle(Point *center, Point *lhs, Point *rhs)
{
return (lhs->x - center->x) * (rhs->y - center->y) - (rhs->x - center->x) * (lhs->y - center->y);
}
你知道我如何通过预先将中心提供给另一个函数来获得只有 2 个参数的函数吗?这在像 haskell 这样的语言中是轻而易举的,但我不知道如何在 C 中做到这一点,虽然我知道我必须使用函数指针和参数——但我对这些技术不是很熟悉。
提前致谢!
最佳答案
您不能将配置数据传递给比较函数。这是 qsort 的一个众所周知的缺点,几代 C 标准制定者都未能解决。
有一个非标准函数 qsort_r 接受一个额外的参数,并将其传递给三参数比较函数。不幸的是,它并非随处可用,即使可用,参数的顺序也不标准。
在不修改数据结构的情况下唯一可移植的方法是使用全局或静态变量:
static Point globalCenter;
int compare (void* p1, void* p2) {
return compareByAngle(&globalCenter, p1, p2);
}
void myFunc () {
...
globalCenter = center;
qsort(points, nPoints, sizeof(Point*), compare);
...
}
重新设计您的数据结构可能更有效也更清晰。如何计算角度数组然后对其进行排序?然后重新排列点以遵循相同的顺序。
关于c - 提供具有单个参数的 C 函数以获取具有更少参数的新函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38027827/