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:
A Guide to Concurrent Queues in Java
Java Program to Implement Stack using Two Queues
Java Program to Implement TreeSet API
Java Program to Implement Sorting of Less than 100 Numbers in O(n) Complexity
Guide to Guava Multimap
Java Program to Find the Nearest Neighbor Using K-D Tree Search
Spring Security Login Page with React
Java Program to Check for balanced parenthesis by using Stacks
Most commonly used String methods in Java
Java Deep Learning Essentials - Yusuke Sugomori
Spring Cloud Connectors and Heroku
Netflix Archaius with Various Database Configurations
Send email with JavaMail
Java Program to Find the Longest Path in a DAG
Intro to Inversion of Control and Dependency Injection with Spring
Build a REST API with Spring and Java Config
Spring Webflux with Kotlin
Spring Boot - Database Handling
Create a Custom Auto-Configuration with Spring Boot
Jackson – Change Name of Field
Getting Started with Forms in Spring MVC
Exploring the Spring Boot TestRestTemplate
Running Spring Boot Applications With Minikube
Java Program to Implement Ternary Heap
Spring NoSuchBeanDefinitionException
Java Switch Statement
An Example of Load Balancing with Zuul and Eureka
Implementing a Runnable vs Extending a Thread
Guide to CountDownLatch in Java
Java Program to Implement SynchronosQueue API
How to Break from Java Stream forEach
Java Program to Construct an Expression Tree for an Prefix Expression