101 lines
2.6 KiB
Java
101 lines
2.6 KiB
Java
|
/*This is a Java Program to Implement Jarvis Algorithm. Jarvis algorithm or the gift wrapping algorithm is an algorithm for computing the convex hull of a given set of points.*/
|
||
|
|
||
|
/**
|
||
|
** Java Program to Implement Jarvis Algorithm
|
||
|
**/
|
||
|
|
||
|
import java.util.Scanner;
|
||
|
import java.util.Arrays;
|
||
|
|
||
|
/** Class point **/
|
||
|
class Point
|
||
|
{
|
||
|
int x, y;
|
||
|
}
|
||
|
|
||
|
/** Class Jarvis **/
|
||
|
public class Jarvis
|
||
|
{
|
||
|
private boolean CCW(Point p, Point q, Point r)
|
||
|
{
|
||
|
int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
|
||
|
if (val >= 0)
|
||
|
return false;
|
||
|
return true;
|
||
|
}
|
||
|
public void convexHull(Point[] points)
|
||
|
{
|
||
|
int n = points.length;
|
||
|
/** if less than 3 points return **/
|
||
|
if (n < 3)
|
||
|
return;
|
||
|
int[] next = new int[n];
|
||
|
Arrays.fill(next, -1);
|
||
|
/** find the leftmost point **/
|
||
|
int leftMost = 0;
|
||
|
for (int i = 1; i < n; i++)
|
||
|
if (points[i].x < points[leftMost].x)
|
||
|
leftMost = i;
|
||
|
int p = leftMost, q;
|
||
|
/** iterate till p becomes leftMost **/
|
||
|
do
|
||
|
{
|
||
|
/** wrapping **/
|
||
|
q = (p + 1) % n;
|
||
|
for (int i = 0; i < n; i++)
|
||
|
if (CCW(points[p], points[i], points[q]))
|
||
|
q = i;
|
||
|
next[p] = q;
|
||
|
p = q;
|
||
|
}
|
||
|
while (p != leftMost);
|
||
|
/** Display result **/
|
||
|
display(points, next);
|
||
|
}
|
||
|
public void display(Point[] points, int[] next)
|
||
|
{
|
||
|
System.out.println("\nConvex Hull points : ");
|
||
|
for (int i = 0; i < next.length; i++)
|
||
|
if (next[i] != -1)
|
||
|
System.out.println("("+ points[i].x +", "+ points[i].y +")");
|
||
|
}
|
||
|
/** Main function **/
|
||
|
public static void main (String[] args)
|
||
|
{
|
||
|
Scanner scan = new Scanner(System.in);
|
||
|
System.out.println("Jarvis Algorithm Test\n");
|
||
|
/** Make an object of Jarvis class **/
|
||
|
Jarvis j = new Jarvis();
|
||
|
System.out.println("Enter number of points n :");
|
||
|
int n = scan.nextInt();
|
||
|
Point[] points = new Point[n];
|
||
|
System.out.println("Enter "+ n +" x, y cordinates");
|
||
|
for (int i = 0; i < n; i++)
|
||
|
{
|
||
|
points[i] = new Point();
|
||
|
points[i].x = scan.nextInt();
|
||
|
points[i].y = scan.nextInt();
|
||
|
}
|
||
|
j.convexHull(points);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
Enter number of points n :
|
||
|
8
|
||
|
Enter 8 x, y cordinates
|
||
|
0 3
|
||
|
4 2
|
||
|
3 5
|
||
|
5 3
|
||
|
3 0
|
||
|
1 1
|
||
|
1 2
|
||
|
2 2
|
||
|
|
||
|
Convex Hull points :
|
||
|
(0, 3)
|
||
|
(3, 5)
|
||
|
(5, 3)
|
||
|
(3, 0)
|
||
|
(1, 1)
|