POJ2007 叉积
题意
给出一堆点,以(0,0)开始,这堆点能组成一个多凸边型,请把这些点从逆时针方向排序。还是以(0,0)开始输出。
思路
数学过关了很简单的题,数学不过关就难受了,叉积是个什么东西嘛???
向量叉积:a x b = ax * by - ay * bx = |a| * |b| * sin<a, b>,可以判断两个向量间夹角是顺时针还是逆时针,但是在这里这个没用!
首先题目定了原点(0,0),所以其实点坐标就是向量坐标,我们再定逆时针为规定方向,此时叉积的正负就可以判断a,b的前后顺序,因为:
- 方向已定(逆时针)
- 多边形为凸边型,所以所有点与原点连线的夹角不会超过180°,这也是为什么题目可以从一个方向得出一个固定顺序的原因。
题目要求的就是这个顺序。
此外如果没有规定第一个点为(0,0),也可以通过任意点减第一个点坐标得到向量后,按上面方法计算。
注意
有个坑的地方是:不要把原点(0,0)放入数组进行比较,此时会WA!!!
代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.Vector;
/**
* @Author Yuri
* @Date 2020/11/27 15:02
* @Version 1.0
* @Description:
*/
public class Main {
static class Point implements Comparable<Point> {
int x, y;
Point(int x, int y){
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point o) {
return -(x * o.y - y * o.x);
}
@Override
public String toString() {
return "(" + x + "," + y + ")";
}
}
static Scanner in = new Scanner(System.in);
static ArrayList<Point> points = new ArrayList<Point>();
public static void main(String[] args) {
Point point = new Point(in.nextInt(), in.nextInt());
while (in.hasNext()) {
points.add(new Point(in.nextInt(), in.nextInt()));
}
Collections.sort(points);
System.out.println("(0,0)");
for (int i = 0; i < points.size(); i++) {
System.out.println(points.get(i));
}
System.out.println();
}
}