Convex Hull 1 Python
- Get link
- X
- Other Apps
PROGRAM TO FIND CONVEX HULL USING JARVIS'S ALGORITHM
# point class with x, y as point class Point: def __init__(self, x, y): self.x = x self.y = y def Left_index(points): ''' Finding the left most point ''' minn = 0 for i in range(1,len(points)): if points[i].x < points[minn].x: minn = i elif points[i].x == points[minn].x: if points[i].y > points[minn].y: minn = i return minn def orientation(p, q, r): ''' To find orientation of ordered triplet (p, q, r). The function returns following values 0 --> p, q and r are colinear 1 --> Clockwise 2 --> Counterclockwise ''' val = (q.y - p.y) * (r.x - q.x) - \ (q.x - p.x) * (r.y - q.y) if val == 0: return 0 elif val > 0: return 1 else: return 2 def convexHull(points, n): # There must be at least 3 points if n < 3: return # Find the leftmost point l = Left_index(points) hull = [] ''' Start from leftmost point, keep moving counterclockwise until reach the start point again. This loop runs O(h) times where h is number of points in result or output. ''' p = l q = 0 while(True): # Add current point to result hull.append(p) ''' Search for a point 'q' such that orientation(p, x, q) is counterclockwise for all points 'x'. The idea is to keep track of last visited most counterclock- wise point in q. If any point 'i' is more counterclock- wise than q, then update q. ''' q = (p + 1) % n for i in range(n): # If i is more counterclockwise # than current q, then update q if(orientation(points[p], points[i], points[q]) == 2): q = i ''' Now q is the most counterclockwise with respect to p Set p as q for next iteration, so that q is added to result 'hull' ''' p = q # While we don't come to first point if(p == l): break # Print Result for each in hull: print(points[each].x, points[each].y) # Driver Code points = [] points.append(Point(0, 3)) points.append(Point(2, 2)) points.append(Point(1, 1)) points.append(Point(2, 1)) points.append(Point(3, 0)) points.append(Point(0, 0)) points.append(Point(3, 3)) convexHull(points, len(points))
OUTPUT
(0, 3) (0, 0) (3, 0) (3, 3)
- Get link
- X
- Other Apps
Comments
Post a Comment