@@ -36,7 +36,8 @@ def check_points(self):
36
36
curr += 1
37
37
return False
38
38
39
- def ort (self , pt1 , pt2 , r ):
39
+ #if we start from left to right
40
+ def ort_min_max (self , pt1 , pt2 , r ):
40
41
v = ((pt2 .get_y ()- pt1 .get_y ())* (r .get_x ()- pt2 .get_x ())
41
42
- (pt2 .get_x ()- pt1 .get_x ())* (r .get_y ()- pt2 .get_y ()))
42
43
if v == 0 :
@@ -46,10 +47,13 @@ def ort(self, pt1 , pt2, r):
46
47
else :
47
48
return CCW
48
49
49
- def cross (self , pt1 , pt2 , r ):
50
+ #if we start from right to left
51
+ def ort_max_min (self , pt1 , pt2 , r ):
50
52
v = ((pt2 .get_x ()- pt1 .get_x ())* (r .get_y ()- pt2 .get_y ())
51
53
- (pt2 .get_y ()- pt1 .get_y ())* (r .get_x ()- pt2 .get_x ()))
52
- if v <= 0 :
54
+ if v == 0 :
55
+ return COLINEAR
56
+ elif v < 0 :
53
57
return CW
54
58
else :
55
59
return CCW
@@ -86,41 +90,52 @@ def sort_function(self,point):
86
90
return point .get_x ()
87
91
88
92
def incremental_convex_hull (self ):
89
- lowerHull = []
90
- upperHull = []
93
+ lower_hull = []
94
+ upper_hull = []
91
95
92
- if len (self .points ) == 0 :
96
+ if len (self .points ) <= 1 :
93
97
return self .points
94
98
95
- #sorting list based on x coord
96
- #self.print_plane()
97
- self .points = sorted (self .points ,key = self .sort_function )
98
- #self.print_plane()
99
+ #sorting list based on x coord {max -> min}
100
+ self .points = sorted (self .points ,key = self .sort_function , reverse = True )
99
101
N = len (self .points )
100
102
101
103
# culculating lower hull #
102
104
for idx in range (N ):
103
- #print idx
104
- while len (lowerHull ) >= 2 and self .cross (lowerHull [- 2 ], lowerHull [- 1 ], self .points [idx ]) == CW :
105
- lowerHull .pop ()
106
- lowerHull .append (self .points [idx ])
105
+ while True :
106
+ curr_len = len (lower_hull )
107
+ if (curr_len >= 2 ):
108
+ ort = self .ort_max_min (lower_hull [- 2 ], lower_hull [- 1 ], self .points [idx ])
109
+ if ort == CW :
110
+ lower_hull .pop ()
111
+ elif ort == CCW :
112
+ break
113
+ else :
114
+ print ("COLINEAR points in the lower_hull" )
115
+ else :
116
+ break
117
+ lower_hull .append (self .points [idx ])
107
118
108
119
# culculating upper hull #
120
+ self .points .reverse ()
109
121
for idx in range (N ):
110
- self .points .reverse ()
111
- #self.print_plane()
112
- while len (upperHull ) >= 2 and \
113
- (self .ort (lowerHull [- 2 ], lowerHull [- 1 ], self .points [idx ]) == CCW or \
114
- self .ort (lowerHull [- 2 ], lowerHull [- 1 ], self .points [idx ]) == COLINEAR ):
115
- upperHull .pop ()
116
- upperHull .append (self .points [idx ])
117
-
118
- #pop common point
119
- lowerHull .pop ()
120
- hull = lowerHull + upperHull
121
- #self.display_hull(lowerHull)
122
- #self.display_hull(upperHull)
122
+ while True :
123
+ curr_len = len (upper_hull )
124
+ if (curr_len >= 2 ):
125
+ ort = self .ort_max_min (upper_hull [- 2 ], upper_hull [- 1 ], self .points [idx ])
126
+ if ort == CW :
127
+ upper_hull .pop ()
128
+ elif ort == CCW :
129
+ break
130
+ else :
131
+ print ("COLINEAR points in the lower_hull" )
132
+ else :
133
+ break
134
+ upper_hull .append (self .points [idx ])
135
+
136
+ hull = lower_hull + upper_hull
123
137
self .display_hull (hull )
138
+ return
124
139
125
140
126
141
def gift_wrap_convex_hull (self ):
@@ -134,7 +149,7 @@ def gift_wrap_convex_hull(self):
134
149
curr_pt = (cr_pt + 1 )% total_points
135
150
#check for orientation of all other Points
136
151
for i in range (0 , total_points ):
137
- ort = self .ort (self .points [cr_pt ], self .points [i ], self .points [curr_pt ])
152
+ ort = self .ort_min_max (self .points [cr_pt ], self .points [i ], self .points [curr_pt ])
138
153
if ort == CCW :
139
154
curr_pt = i
140
155
cr_pt = curr_pt
0 commit comments