凸包练习: POJ 2187(JAVA)

 分治化求凸包,请参看:http://128kj.iteye.com/admin/blogs/1748622
POJ 2187题意:
给出一个点集,求两点之间最长的距离的平方,最长距离的两个点一定在凸包上,
首先,将点集凸包化,这样就可以排除了很多点,接下来就是两个for就可以.

下面是AC过代码:

Java代码 复制代码 收藏代码
  1. import java.util.*;
  2. class Line {//线
  3. Point p1, p2;
  4. Line(Point p1, Point p2) {
  5. this.p1 = p1;
  6. this.p2 = p2;
  7. }
  8. public Point getP1(){
  9. return p1;
  10. }
  11.  
  12. public Point getP2(){
  13. return p2;
  14. }
  15.  
  16. public double getLength() {
  17. double dx = Math.abs(p1.x - p2.x);
  18. double dy = Math.abs(p1.y - p2.y);
  19. return Math.sqrt(dx * dx + dy * dy);
  20. }
  21.  
  22.  
  23. }
  24.  
  25. class Point{//点
  26. double x;
  27. double y;
  28.  
  29. public Point(double x,double y){
  30. this.x=x;
  31. this.y=y;
  32. }
  33. }
  34.  
  35.  
  36. /*
  37. * 分治法求凸包
  38. */
  39. class QuickTuBao {
  40. List<Point> pts = null;//点集
  41. List<Line> lines = new ArrayList<Line>();//点集pts的凸包
  42.  
  43. public void setPointList(List<Point> pts) {
  44. this.pts = pts;
  45. }
  46.  
  47. public QuickTuBao(List<Point> pts){
  48. this.pts=pts;
  49. }
  50.  
  51. //求凸包,结果存入lines中
  52. public List<Line> eval() {
  53. lines.clear();
  54. if (pts == null || pts.isEmpty()) { return lines; }
  55. List<Point> ptsLeft = new ArrayList<Point>();//左凸包中的点
  56. List<Point> ptsRight = new ArrayList<Point>();//右凸包中的点
  57.  
  58. //按x坐标对pts排序
  59. Collections.sort(pts, new Comparator<Point>() {
  60. public int compare(Point p1, Point p2) {
  61. if(p1.x-p2.x>0) return 1;
  62. if(p1.x-p2.x<0) return -1;
  63. return 0;
  64. }
  65.  
  66. });
  67.  
  68. Point p1 = pts.get(0);//最左边的点
  69. Point p2 = pts.get(pts.size()-1);//最右边的点,用直线p1p2将原凸包分成两个小凸包
  70. Point p3 = null;
  71. double area = 0;
  72. for (int i = 1; i < pts.size(); i++) {
  73. p3 = pts.get(i);
  74. area = getArea(p1, p2, p3);//求此三点所成三角形的有向面积
  75. if (area > 0) {
  76. ptsLeft.add(p3);
  77. } else if (area < 0) {
  78. ptsRight.add(p3);
  79. }
  80. }
  81. d(p1, p2, ptsLeft);//分别求解
  82. d(p2, p1, ptsRight);
  83. return lines;
  84. }      

你可能感兴趣的:(java)