Advertisement
Guest User

Untitled

a guest
Mar 14th, 2012
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.79 KB | None | 0 0
  1. package compGeo;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Point;
  5. import java.util.ArrayList;
  6. import java.util.Vector;
  7.  
  8. public class Qh extends Algorithm {
  9.  
  10.     boolean done = false;
  11.     GeoComp GeoC;
  12.     ArrayList<Point> points;
  13.     int size, pNum;
  14.     int ii = 0;
  15.     ArrayList<Point> leftSet = new ArrayList<Point>();
  16.     ArrayList<Point> rightSet = new ArrayList<Point>();
  17.  
  18.     public Qh(GeoComp app) {
  19.         GeoC = app;
  20.     }
  21.  
  22.     @Override
  23.     public void start(Vector v) {
  24.         size = v.size();
  25.         points = new ArrayList<Point>(size);
  26.         for (int i = 0; i < size; i++) {
  27.             points.add((Point) v.elementAt(i));
  28.         }
  29.         pNum = GeoC.points.size();
  30.         done = false;
  31.  
  32.     }
  33.  
  34.     @Override
  35.     public void nextStep() {
  36.         ArrayList<Point> convexHull = new ArrayList<Point>();
  37.         // find extremals
  38.         int minPoint = -1, maxPoint = -1;
  39.         int minX = Integer.MAX_VALUE;
  40.         int maxX = Integer.MIN_VALUE;
  41.         //System.out.println(pNum);
  42.         //System.out.println(points.size());
  43.         for (int i = 0; i < points.size(); i++) {
  44.             // if (i < pNum - 1) {
  45.             // System.out.println(points.size() + " p.size()");
  46.             if (points.get(i).x < minX) {
  47.                 minX = points.get(i).x;
  48.                 minPoint = i;
  49.                 // GeoC.rysujPunkt(points[minPoint], Color.green);
  50.                 // System.out.print("minX: " + minX + " minPoint: " + minPoint +
  51.                 // "\n");
  52.             }
  53.             if (points.get(i).x > maxX) {
  54.                 maxX = points.get(i).x;
  55.                 maxPoint = i;
  56.                 // GeoC.rysujPunkt(points[maxPoint], Color.green);
  57.                 i++;
  58.             }
  59.             // } else {
  60.             // done = true;
  61.  
  62.         }
  63.         // }
  64.        
  65.         if (minPoint != -1 && maxPoint != -1) {
  66.             // System.out.print("minPoint: " + minPoint + " maxPoint: " +
  67.             // maxPoint);
  68.  
  69.             // return;
  70.  
  71.             // System.out.println("minPoint: " + minPoint + " maxPoint: " +
  72.             // maxPoint);
  73.             if(ii == 0)
  74.                 GeoC.rysujLinie(points.get(minPoint), points.get(maxPoint), Color.red);
  75.             Point A = points.get(minPoint);
  76.             Point B = points.get(maxPoint);
  77.             convexHull.add(A);
  78.             convexHull.add(B);
  79.  
  80.             //points.remove(A);
  81.             //points.remove(B);
  82.  
  83.             // for (int i = 0; i < pNum; i++) {
  84.             if (ii < points.size()) {
  85.                 Point p = points.get(ii);
  86.                 if (pointLocation(A, B, p) == -1) {
  87.                     // System.out.print(pointLocation(A, B, p) + "\n");
  88.                     leftSet.add(p);
  89.                     GeoC.rysujPunkt(p, Color.red);
  90.                 } else {
  91.                     rightSet.add(p);
  92.                     //GeoC.rysujPunkt(p, Color.blue);
  93.                 }
  94.                 ii++;
  95.                
  96.                
  97.             } else {
  98.                 System.out.println("rightSet: " + rightSet.size());
  99.                 System.out.println("leftSet: " + leftSet.size());
  100.                 hullSet(A, B, rightSet, convexHull);
  101.                 hullSet(B, A, leftSet, convexHull);
  102.                 ii = 0;
  103.                 done = true;
  104.             }
  105.  
  106.             /*// }
  107.             hullSet(A, B, rightSet, convexHull);
  108.             hullSet(B, A, leftSet, convexHull);*/
  109.         } else {
  110.             ii = 0;
  111.         }
  112.  
  113.         // done = true;
  114.  
  115.     }
  116.  
  117.     @Override
  118.     public boolean isDone() {
  119.         return done;
  120.     }
  121.  
  122.     /*
  123.      * public ArrayList<Point> quickHull(ArrayList<Point> points) {
  124.      * ArrayList<Point> convexHull = new ArrayList<Point>(); if (points.size() <
  125.      * 3) return (ArrayList) points.clone(); // find extremals int minPoint =
  126.      * -1, maxPoint = -1; int minX = Integer.MAX_VALUE; int maxX =
  127.      * Integer.MIN_VALUE; for (int i = 0; i < points.size(); i++) { if
  128.      * (points.get(i).x < minX) { minX = points.get(i).x; minPoint = i; } if
  129.      * (points.get(i).x > maxX) { maxX = points.get(i).x; maxPoint = i; } }
  130.      * Point A = points.get(minPoint); Point B = points.get(maxPoint);
  131.      * convexHull.add(A); convexHull.add(B); points.remove(A); points.remove(B);
  132.      *
  133.      * ArrayList<Point> leftSet = new ArrayList<Point>(); ArrayList<Point>
  134.      * rightSet = new ArrayList<Point>();
  135.      *
  136.      * for (int i = 0; i < points.size(); i++) { Point p = points.get(i); if
  137.      * (pointLocation(A, B, p) == -1) leftSet.add(p); else rightSet.add(p); }
  138.      * hullSet(A, B, rightSet, convexHull); hullSet(B, A, leftSet, convexHull);
  139.      *
  140.      * return convexHull; }
  141.      */
  142.     /*
  143.      * Computes the square of the distance of point C to the segment defined by
  144.      * points AB
  145.      */
  146.     public int distance(Point A, Point B, Point C) {
  147.         int ABx = B.x - A.x;
  148.         int ABy = B.y - A.y;
  149.         int num = ABx * (A.y - C.y) - ABy * (A.x - C.x);
  150.         if (num < 0)
  151.             num = -num;
  152.         return num;
  153.     }
  154.  
  155.     public void hullSet(Point A, Point B, ArrayList<Point> set,
  156.             ArrayList<Point> hull) {
  157.         System.out.println(set.size());
  158.         int insertPosition = hull.indexOf(B);
  159.         if (set.size() == 0) {
  160.             // System.out.println("151");
  161.             return;
  162.         }
  163.         if (set.size() == 1) {
  164.             // System.out.println("155");
  165.             Point p = set.get(0);
  166.             set.remove(p);
  167.             hull.add(insertPosition, p);
  168.             return;
  169.         }
  170.         int dist = Integer.MIN_VALUE;
  171.         int furthestPoint = -1;
  172.         for (int i = 0; i < set.size(); i++) {
  173.             Point p = set.get(i);
  174.             int distance = distance(A, B, p);
  175.             if (distance > dist) {
  176.                 dist = distance;
  177.                 furthestPoint = i;
  178.             }
  179.         }
  180.         Point P = set.get(furthestPoint);
  181.         set.remove(furthestPoint);
  182.         hull.add(insertPosition, P);
  183.  
  184.         // Determine who's to the left of AP
  185.         ArrayList<Point> leftSetAP = new ArrayList<Point>();
  186.  
  187.         //System.out.println(set.size());
  188.  
  189.         for (int i = 0; i < set.size(); i++) {
  190.             // System.out.println("178");
  191.             Point M = set.get(i);
  192.             if (pointLocation(A, P, M) == 1) {
  193.                 leftSetAP.add(M);
  194.                 GeoC.rysujLinie(M, A, Color.red);
  195.                 GeoC.rysujLinie(P, M, Color.red);
  196.                 //System.out.println("sgdf");
  197.             }
  198.        
  199.         }
  200.  
  201.         // Determine who's to the left of PB
  202.         ArrayList<Point> leftSetPB = new ArrayList<Point>();
  203.         for (int i = 0; i < set.size(); i++) {
  204.             Point M = set.get(i);
  205.             if (pointLocation(P, B, M) == 1) {
  206.                 leftSetPB.add(M);
  207.                 GeoC.rysujLinie(M, P, Color.red);
  208.                 GeoC.rysujLinie(B, M, Color.red);
  209.             }
  210.         }
  211.         hullSet(A, P, leftSetAP, hull);
  212.         hullSet(P, B, leftSetPB, hull);
  213.  
  214.     }
  215.  
  216.     public int pointLocation(Point A, Point B, Point P) {
  217.         int cp1 = (A.x - B.x) * (P.y - B.y) - (P.x - B.x) * (A.y - B.y);
  218.         return (cp1 > 0) ? 1 : -1;
  219.     }
  220.  
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement