如何使用 qsort() 根据点与其他参考点的斜率对点进行排序? (没有 qsort_r()/qsort_s())

How to sort points based on the slope they make with other reference point using qsort() ? (Without qsort_r()/qsort_s())

我需要找到 3 个以上的共线点(通过检查它们之间的斜率)。

这里是给出斜率的代码:

#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
#include <search.h>
#define inf INFINITY
typedef struct point_ {
    int x;
    int y;
}point;
float slope(point *p1,point *p2) {
    if(p2->y==p1->y && p2->x!=p1->x) return 0;//horizontal line segment
   else if(p2->x==p1->x && p2->y!=p1->y) return inf; //vertical line segment
   else if(p2->x==p1->x && p2->y==p1->y) return -inf;//point to itself
   else 
   return (p2->y-p1->y)/((float)(p2->x-p1->x));
}

我需要根据点与参考点的斜率对点进行排序,以便我可以通过检查 no.of 相等的斜率来找到共线性。

因为 qsort_s()/qsort_r() 无法在我尝试使用 this SO discussion 中的 sort_r 的所有情况下实现。

int fastCollinearPoints(point *p,int n) {
    point copy[n];
    int i;
    for(i=0;i<n;i++) copy[i]=p[0];
    sort_r(copy,n,sizeof(point),slopeOrder,&copy[0]);
}

比较函数

int slopeOrder(const void *p11,const void *p22,void *arg) {
    point *p1 = (point *) p11;
    point *p2 = (point *) p22;
    point *p= (point*) p;
    int a=slope(p,p1),b=slope(p,p2);
    if(a<b) return -1;
    else if(a>b) return 1;
    else return 0;
}

通过这种方式实施时遇到错误 对 qsort_r 的未定义引用。如果这可以使用 qsort_r()/qsort_s() 实现,我需要对比较功能进行哪些更改?

'slopeOrder' 根本不使用上下文参数 (arg),而是 'manufactor' a point *p = (...) p

尝试:

int slopeOrder(const void *p11,const void *p22,void *arg) {
    point *p1 = (point *) p11;
    point *p2 = (point *) p22;
///    point *p= (point*) p;
/// REPLACEMENT:
    point *p = (point *p) arg ;

如果没有具体的例子很难验证来复制问题。

此外,还有两个来自严格编译 (c99 -Wall) 的警告:

  • fastCollinearPoints 没有 return 任何值
  • 以下是空操作:if(prevSlope!=currSlope) numOfSeg; //对于其他共线集合

一种仅使用 qsort() 并传递引用参数的方法。 我以可以容纳参考点的方式更改了点的结构。

typedef struct point_ {
 int x;
 int y;
 struct point_ *ref; //added for reference point
 }point;

这与所需的实施完美无缺。