65 lines
1.6 KiB
Python
65 lines
1.6 KiB
Python
# SPDX-License-Identifier: MIT
|
|
# Copyright (c) 2019 Akumatic
|
|
|
|
import math
|
|
|
|
def distance (
|
|
p: tuple,
|
|
q: tuple
|
|
) -> float:
|
|
""" Calculates direct distance between two points given as tuples.
|
|
|
|
Args:
|
|
p (tuple):
|
|
A tuple containing x and y coordinates
|
|
q (tuple):
|
|
A tuple containing x and y coordinates
|
|
|
|
Returns:
|
|
A float with the distance between given points as value
|
|
"""
|
|
return math.sqrt((p[0] - q[0])**2 + (p[1] - q[1])**2)
|
|
|
|
def find_closest_element (
|
|
points: list,
|
|
point: tuple
|
|
) -> tuple:
|
|
""" Finds the closes element to a given point
|
|
|
|
Args:
|
|
points (list):
|
|
A list containing tuples of coordinates (x, y)
|
|
point (tuple):
|
|
The (x, y) coordinates of the given point
|
|
|
|
Returns:
|
|
the tuple of the closest point and the distance
|
|
between the given and closest point
|
|
"""
|
|
start, min_dist = None, None
|
|
for p in points:
|
|
dist = distance(p[:2], point)
|
|
if min_dist is None or dist < min_dist:
|
|
start, min_dist = p, dist
|
|
|
|
return start, min_dist
|
|
|
|
|
|
def circularity (
|
|
area: float,
|
|
perimeter: float
|
|
) -> float:
|
|
""" Calculates the circularity shape factor with given area and perimeter.
|
|
|
|
Args:
|
|
area (float):
|
|
area of a shape
|
|
perimeter (float):
|
|
length of the perimeter of a shape
|
|
|
|
Returns:
|
|
A float with the circularity shape factor as value
|
|
"""
|
|
if perimeter == 0:
|
|
return 0.0
|
|
return (4 * math.pi * area) / (perimeter ** 2) |