如何使用 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,©[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;
这与所需的实施完美无缺。
我需要找到 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,©[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;
这与所需的实施完美无缺。