Advertisement
Guest User

Untitled

a guest
May 1st, 2016
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.25 KB | None | 0 0
  1. public class Check {
  2.     public ArrayList<Point> quickHull(ArrayList<Point> points){
  3.         System.out.println("Зашли в Check?");
  4.         ArrayList<Point> qHull=new ArrayList<Point>();
  5.         int min=Integer.MAX_VALUE;
  6.         int max= Integer.MIN_VALUE;
  7.         int imin=points.size()-1;int imax= points.size()-1;
  8.         for(int i=0;i<points.size();i++){
  9.             if (points.get(i).x>min){
  10.                 min=points.get(i).x;
  11.                 imin=i;
  12.             }
  13.             if (points.get(i).x>max){
  14.                 max=points.get(i).x;
  15.                 imax=i;
  16.             }
  17.         }
  18.         Point A= points.get(imin);
  19.         Point B=points.get(imax);
  20.        qHull.add(A);
  21.        qHull.add(B);
  22.         points.remove(A);
  23.         points.remove(B);
  24.  
  25.         //Создаём левое и правое относительно AB множества точек
  26.         ArrayList<Point> leftSet=new ArrayList<Point>();
  27.         ArrayList<Point> rightSet=new ArrayList<Point>();
  28.  
  29.         //Разбиваем множества точек на левое и правое множество
  30.  
  31.         for (int i=0;i<points.size();i++){
  32.             Point p=points.get(i);
  33.             if (isLeft(A,B,p)==1){
  34.                 leftSet.add(points.get(i));
  35.             }
  36.             else rightSet.add(p);
  37.         }
  38.         hullSet(A,B,leftSet,qHull);
  39.         hullSet(B,A,rightSet,qHull);
  40.         return qHull;
  41.     }
  42.     public int isLeft(Point A,Point B,Point P)
  43.     {
  44.         long cross=((B.x-A.x)*(P.y-A.y)-(B.y-A.y)*(P.x-A.x));
  45.         return (cross>0)?1:-1;
  46.     }
  47.     public long distance(Point A, Point B,Point P)
  48.     {
  49.         long num=((B.x-A.x)*(P.y-A.y)-(B.y-A.y)*(P.x-A.x));
  50.         if (num<0){
  51.             num=-num;
  52.         }
  53.         return num;
  54.     }
  55.     public void hullSet(Point A, Point B, ArrayList<Point> set, ArrayList<Point> hull){
  56.         int insertPosition=set.indexOf(B);
  57.         if (set.size()==0){
  58.             return;
  59.         }
  60.         if (set.size()==1){
  61.             Point p=set.get(0);
  62.             set.remove(p);
  63.             hull.add(insertPosition,p);
  64.             return;
  65.         }
  66.         long dist=Integer.MIN_VALUE;
  67.         int furtherPoint=0;
  68.         for(int i=0;i<set.size();i++){
  69.             Point p=set.get(i);
  70.             long distance=distance(A,B,p);
  71.             if(distance(A,B,p)>dist)
  72.             {
  73.                 dist=distance;
  74.                 furtherPoint=i;
  75.             }
  76.         }
  77.         Point P=set.get(furtherPoint);
  78.         set.remove(furtherPoint);
  79.         hull.add(insertPosition,P);
  80.  
  81.         //Определяем кто находится слева от AP
  82.  
  83.         ArrayList<Point> leftSetAP=  new ArrayList<Point>();
  84.          for(int i=0;i<set.size();i++){
  85.              Point M=set.get(i);
  86.              if (isLeft(A,B,M)==1){
  87.                  leftSetAP.add(M);
  88.              }
  89.          }
  90.  
  91.         //Определяем кто находится слева от PB
  92.  
  93.         ArrayList<Point> leftSetPB=new ArrayList<Point>();
  94.         for(int i=0;i<set.size();i++){
  95.             Point M=set.get(i);
  96.             if (isLeft(P,B,M)==1){
  97.                 leftSetPB.add(M);
  98.             }
  99.         }
  100.         hullSet(A,P,leftSetAP,hull);
  101.         hullSet(P,B,leftSetPB,hull);
  102.  
  103.     }
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement