Files
computational-geometry-visu/point.py
Pascal Lais 6f83b57ffb Add sort function and class methods to class Point
The sort function takes a list of Point objects and sorts them either
by their x or y coordinate using merge sort.
Also added a method set_random, that sets the coordinates to random
values and a method str, that returns the coordinates as string.
2020-03-09 07:48:07 +01:00

106 lines
3.5 KiB
Python

#!/usr/bin/python3
"""The Point Module defines a Point class"""
import random
import copy
class Point():
"""The Point class handles a single two-dimensional point in the coordinate system"""
def __init__(self, x=0, y=0):
self.set_x(x)
self.set_y(y)
def set_x(self, new_x):
"""Set the X-Coordinate of the Point"""
if int == type(new_x):
self.__x = new_x
elif float == type(new_x):
self.__x = int(new_x)
else:
raise Exception(self, "Type of x has to be int")
def get_x(self):
"""Returns the X-Coordinate of the Point"""
return self.__x
def set_y(self, new_y):
"""Set the Y-Coordinate of the Point"""
if int == type(new_y):
self.__y = new_y
elif float == type(new_y):
self.__x = int(new_y)
else:
raise Exception(self, "Type of y has to be int")
def get_y(self):
"""Returns the Y-Coordinate of the Point"""
return self.__y
def set_random(self, min_x=0, max_x=100, min_y=0, max_y=100):
"""Set the point to a random place inside the boundaries"""
self.set_x(random.randint(min_x, max_x))
self.set_y(random.randint(min_y, max_y))
return self
def str(self):
"""Returns the coordinates as a string"""
return "(" + str(self.get_x()) + "/" + str(self.get_y()) + ")"
def draw(self):
"""TODO: Draw the point in a canvas"""
def sort_point_set(point_set, sort_by_y=False):
"""Sort a Point set using merge sort"""
num_compares = 0
for pnt in point_set:
if not isinstance(pnt, Point):
raise Exception("Elements of point set are not all of type point.Point")
if len(point_set) > 1:
mid = len(point_set)//2 #Finding the mid of the array
left = copy.deepcopy(point_set[:mid]) # Dividing the array elements
right = copy.deepcopy(point_set[mid:]) # into 2 halves
num_compares += sort_point_set(left, sort_by_y) # Sorting the first half
num_compares += sort_point_set(right, sort_by_y) # Sorting the second half
i = j = k = 0
# Copy data to temp arrays left[] and right[]
while i < len(left) and j < len(right):
left_value = left[i].get_x()
right_value = right[j].get_x()
if sort_by_y:
left_value = left[i].get_y()
right_value = right[j].get_y()
if left_value == right_value:
left_value = left[i].get_y()
right_value = right[j].get_y()
if sort_by_y:
left_value = left[i].get_x()
right_value = right[j].get_x()
if left_value < right_value:
point_set[k] = copy.deepcopy(left[i])
i += 1
else:
point_set[k] = copy.deepcopy(right[j])
j += 1
num_compares += 1
elif left_value < right_value:
point_set[k] = copy.deepcopy(left[i])
i += 1
else:
point_set[k] = copy.deepcopy(right[j])
j += 1
k += 1
num_compares += 1
# Checking if any element was left
while i < len(left):
point_set[k] = copy.deepcopy(left[i])
i += 1
k += 1
while j < len(right):
point_set[k] = copy.deepcopy(right[j])
j += 1
k += 1
return num_compares