This is a Java Program to implement Quick Hull Algorithm to find convex hull. Here we’ll talk about the Quick Hull algorithm, which is one of the easiest to implement and has a reasonable expected running time of O(n log n).
Here is the source code of the Java Program to Implement Quick Hull Algorithm to Find Convex Hull. The Java program is successfully compiled and run on a Windows system. The program output is also shown below.
//This is a java program to find a points in convex hull using quick hull method //source: Alexander Hrishov's website //URL: http://www.ahristov.com/tutorial/geometry-games/convex-hull.html import java.util.ArrayList; import java.util.Scanner; public class QuickHull { public ArrayList<Point> quickHull(ArrayList<Point> points) { ArrayList<Point> convexHull = new ArrayList<Point>(); if (points.size() < 3) return (ArrayList) points.clone(); int minPoint = -1, maxPoint = -1; int minX = Integer.MAX_VALUE; int maxX = Integer.MIN_VALUE; for (int i = 0; i < points.size(); i++) { if (points.get(i).x < minX) { minX = points.get(i).x; minPoint = i; } if (points.get(i).x > maxX) { maxX = points.get(i).x; maxPoint = i; } } Point A = points.get(minPoint); Point B = points.get(maxPoint); convexHull.add(A); convexHull.add(B); points.remove(A); points.remove(B); ArrayList<Point> leftSet = new ArrayList<Point>(); ArrayList<Point> rightSet = new ArrayList<Point>(); for (int i = 0; i < points.size(); i++) { Point p = points.get(i); if (pointLocation(A, B, p) == -1) leftSet.add(p); else if (pointLocation(A, B, p) == 1) rightSet.add(p); } hullSet(A, B, rightSet, convexHull); hullSet(B, A, leftSet, convexHull); return convexHull; } public int distance(Point A, Point B, Point C) { int ABx = B.x - A.x; int ABy = B.y - A.y; int num = ABx * (A.y - C.y) - ABy * (A.x - C.x); if (num < 0) num = -num; return num; } public void hullSet(Point A, Point B, ArrayList<Point> set, ArrayList<Point> hull) { int insertPosition = hull.indexOf(B); if (set.size() == 0) return; if (set.size() == 1) { Point p = set.get(0); set.remove(p); hull.add(insertPosition, p); return; } int dist = Integer.MIN_VALUE; int furthestPoint = -1; for (int i = 0; i < set.size(); i++) { Point p = set.get(i); int distance = distance(A, B, p); if (distance > dist) { dist = distance; furthestPoint = i; } } Point P = set.get(furthestPoint); set.remove(furthestPoint); hull.add(insertPosition, P); // Determine who's to the left of AP ArrayList<Point> leftSetAP = new ArrayList<Point>(); for (int i = 0; i < set.size(); i++) { Point M = set.get(i); if (pointLocation(A, P, M) == 1) { leftSetAP.add(M); } } // Determine who's to the left of PB ArrayList<Point> leftSetPB = new ArrayList<Point>(); for (int i = 0; i < set.size(); i++) { Point M = set.get(i); if (pointLocation(P, B, M) == 1) { leftSetPB.add(M); } } hullSet(A, P, leftSetAP, hull); hullSet(P, B, leftSetPB, hull); } public int pointLocation(Point A, Point B, Point P) { int cp1 = (B.x - A.x) * (P.y - A.y) - (B.y - A.y) * (P.x - A.x); if (cp1 > 0) return 1; else if (cp1 == 0) return 0; else return -1; } public static void main(String args[]) { System.out.println("Quick Hull Test"); Scanner sc = new Scanner(System.in); System.out.println("Enter the number of points"); int N = sc.nextInt(); ArrayList<Point> points = new ArrayList<Point>(); System.out.println("Enter the coordinates of each points: <x> <y>"); for (int i = 0; i < N; i++) { int x = sc.nextInt(); int y = sc.nextInt(); Point e = new Point(x, y); points.add(i, e); } QuickHull qh = new QuickHull(); ArrayList<Point> p = qh.quickHull(points); System.out .println("The points in the Convex hull using Quick Hull are: "); for (int i = 0; i < p.size(); i++) System.out.println("(" + p.get(i).x + ", " + p.get(i).y + ")"); sc.close(); } }
Output:
$ javac QuickHull.java $ java QuickHull Quick Hull Test Enter the number of points 4 Enter the coordinates of each points: <x> <y> 12 32 45 98 65 12 10 30 The points in the Convex hull using Quick Hull are: (10, 30) (45, 98) (65, 12)
Related posts:
Java Program to Solve a Matching Problem for a Given Specific Case
Ways to Iterate Over a List in Java
Guide to the Java Clock Class
Using a List of Values in a JdbcTemplate IN Clause
Java Program to Find the Vertex Connectivity of a Graph
Reactive WebSockets with Spring 5
Convert Time to Milliseconds in Java
Java 8 Collectors toMap
Custom Exception trong Java
Simplify the DAO with Spring and Java Generics
Spring @Primary Annotation
Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions
Apache Commons Collections Bag
Java Program to Describe the Representation of Graph using Adjacency Matrix
Creating a Custom Starter with Spring Boot
Hướng dẫn Java Design Pattern – Prototype
Guide to Character Encoding
Java Program to Implement SimpeBindings API
Java Program to Implement Skip List
How to Convert List to Map in Java
Understanding Memory Leaks in Java
Java Program to Implement the RSA Algorithm
A Guide to @RepeatedTest in Junit 5
So sánh HashSet, LinkedHashSet và TreeSet trong Java
Java Program to Implement Hash Tables Chaining with Binary Trees
Java Program to Perform Arithmetic Operations on Numbers of Size
Jackson – JsonMappingException (No serializer found for class)
Java Program to Implement Solovay Strassen Primality Test Algorithm
Phân biệt JVM, JRE, JDK
Spring Data JPA and Null Parameters
Immutable Objects in Java
Java Program to Implement Borwein Algorithm