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();
    }
}
posted @ 2020-11-27 17:03  AkimotoAkira  阅读(55)  评论(0编辑  收藏  举报