forked from LindseyRRay/Graham_Scan
/
algorithm.py
62 lines (46 loc) · 1.51 KB
/
algorithm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#Algorithm
from state_manager import StateManager, State
from geometry import Point, Segment
import sys
import copy
class Algorithm:
def __init__(self, point_array):
self.point_array = point_array
self.stack = list()
self.state_manager = StateManager()
def increment_state(self):
self.state_manager.increment_state()
def segments(self):
if not self.stack:
return []
tuple_list = zip(self.stack, self.stack[1:])
segment_list = map(lambda x: Segment(x[0], x[1]), tuple_list)
return segment_list
def min_point(self):
#return leftmost min point by y coord
min_point = Point(sys.maxsize, sys.maxsize)
for i in self.point_array:
if i < min_point:
min_point=i
return min_point
def polar_angle_sort(self, min_point):
sort_list = copy.deepcopy(self.point_array)
sort_list.remove(min_point)
sort_list.sort(key = lambda point: Point.calculate_polar_angle(min_point, point))
sort_list.insert(0, min_point)
return sort_list
def sort_point_array(self):
self.point_array = self.polar_angle_sort(self.min_point())
def init_stack(self):
self.stack = list()
self.stack.append(self.point_array[0])
self.stack.append(self.point_array[1])
self.stack.append(self.point_array[2])
def next_step(self):
if self.state_manager.current_state == State.not_run:
self.increment_state()
elif self.state_manager.current_state == State.initial_point:
self.sort_point_array()
self.increment_state()
elif self.state_manager.current_state == State.init_stack:
self.init_stack()