发布于 2019-01-13 17:18:46
假设initial是具有最低Y坐标的Point2D。另外,让我们假设List<Point2D> points是一个包含所有其他可用点的列表,但它不包含initial点。
为了对列表进行排序,我们可以在比较器中使用Collections.sort:
Collections.sort(points, (a, b) -> {
double cotanA = -(a.getX() - initial.getX()) / (a.getY() - initial.getY());
double cotanB = -(b.getX() - initial.getX()) / (b.getY() - initial.getY());
if (cotanA - cotanB < 0) {
return 1;
}
return -1;
});编辑:
这个解决方案可能会被除以零。克服这一问题的一种方法是使用交叉积。见Erfan Alimohammadi的这个答案。
发布于 2019-01-14 14:01:33
我修改了这个问题的最后一个答案。
为Point定义一个新类
class Point {
private long x, y;
Point(long x, long y) {
this.x = x;
this.y = y;
}
Point() {
x = 0;
y = 0;
}
public long getX() {
return x;
}
public long getY() {
return y;
}
}定义一个计算两个向量的交叉积的新函数:
public long cross(long x1, long y1, long x2, long y2) {
return x1 * y2 - x2 * y1;
}假设initial是具有最低Y坐标的Point。另外,让我们假设List<Point> points是一个包含所有其他可用点的列表,但它不包含initial点。
为了对列表进行排序,我们可以在比较器中使用Collections.sort:
Collections.sort(points, (a, b) -> {
long cr = cross(a.getX() - initial.getX(), a.getY() - initial.getY(), b.getX() - initial.getX(), b.getY() - initial.getY());
if (cr > 0)
return 1;
else
return -1;
});在这个解中,我们使用交叉积来检查两个向量是顺时针方向还是逆时针方向。这种解决方案有两个好处:
https://stackoverflow.com/questions/54170381
复制相似问题