一.原题链接:
http://poj.org/problem?id=2007
二.题目大意:
给一个组成凸包的多边形,有一个顶点在 (0,0) ,从 (0,0) 开始,逆时针输出凸包的点。
三.解题思路:
其实就是输出凸包上的点,先找出
y
值最小,
极角排序方法参考POJ1113的解题报告。
四.代码:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
class Main {
static final int MAX_SIZE = 1050;
static final double INF = 1e40;
static final double ESP = 1e-4;
public static void reDirectionInput(){
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream("in.txt"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.setIn(in);
}
static int vertexNum;
static List<Point> points = new ArrayList<Point>();
static Point base;
static int cross(Vector v1, Vector v2){
return v1.x*v2.y - v2.x*v1.y;
}
static double pointDist(Point p1, Point p2){
return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x) +
(p1.y-p2.y)*(p1.y-p2.y));
}
static void sortPoints(){
Collections.sort(points, new Comparator(){
@Override
public int compare(Object arg0, Object arg1) {
Point p1 = (Point)arg0;
Point p2 = (Point)arg1;
Vector v1 = new Vector();
Vector v2 = new Vector();
v1.setXY(base, p1);
v2.setXY(p1, p2);
int res = cross(v1, v2);
if(res > 0){
return -1;
}else if(res == 0){
return (pointDist(p1, base) >
pointDist(p2, base)? 1:-1);
}else{
return 1;
}
}
});
}
public static void main (String args[]){
//reDirectionInput();
Scanner in = new Scanner(System.in);
int x, y, idx = 0;
vertexNum = 0;
while(in.hasNext()){
x = in.nextInt();
y = in.nextInt();
Point p = new Point();
p.setXY(x, y);
points.add(p);
if(points.get(idx).y > y ||
points.get(idx).y == points.get(idx).y &&
points.get(idx).x > x ){
idx = vertexNum;
}
vertexNum++;
}
base = points.get(idx);
sortPoints();
for(idx = 0; idx < vertexNum; idx++){
if(points.get(idx).x == 0 && points.get(idx).y == 0){
break;
}
}
System.out.printf("(%d,%d)\n", points.get(idx).x, points.get(idx).y);
int saveIdx = idx;
for(idx = (idx+1)%vertexNum; idx != saveIdx; idx = (idx+1)%vertexNum){
System.out.printf("(%d,%d)\n", points.get(idx).x, points.get(idx).y);
}
in.close();
}
}
class Point{
public void setXY(int x, int y) {
this.x = x;
this.y = y;
}
public int x, y;
}
class Vector{
public void setXY(Point begin, Point end) {
this.x = end.x-begin.x;
this.y = end.y-begin.y;
}
public Vector reVector() {
Vector v = new Vector();
v.x = -x;
v.y = -y;
return v;
}
public int x, y;
}