Source code for ovl.math.geometry

import numpy as np
import math


[docs]def y_intersection(line_slope, intercept, x_value): """ Finds the y value of the line (y = mx + b) at point x and returns the point This basically solves y = mx + b :param line_slope: slope of the line (m) :param intercept: the intercept of the line (b) :param x_value: the value to be used (substituted with x) :return: the y value """ return x_value, line_slope * x_value + intercept
[docs]def x_intersection(line_slope, intercept, y_value): """ Calculates the x value of which the line according to the given y value This basically solves y = mx + b :param line_slope: slope of the line (m) :param intercept: the intercept of the line (b) :param y_value: the value to be used (substituted with x) :return: the y value """ return (y_value - intercept) / float(line_slope), y_value if line_slope != 0 else (0, y_value)
[docs]def slope(first_point, second_point): """ Returns the slope between 2 points :param first_point: first point (x,y) :param second_point: second point (x,y) :return: the slope """ return 0. if first_point[0] == second_point[0] else\ ((float(first_point[1]) - float(second_point[1])) / (float(first_point[0]) - float(second_point[0])))
[docs]def angle_between_points(first_point, second_point): """ Calculates the angle between the 2 points and the horizontal axis :param first_point: the first point (2d) :param second_point: the second point (2d) :return: the angle """ return math.degrees(math.atan(slope(first_point, second_point)))
[docs]def contour_angle_line(contour): """ Returns the angle of the line created by the top-most and bottom-most points of a contour :param contour: the contour, a numpy array :return: the angle in degrees """ if type(contour) != np.ndarray: raise TypeError("Contour must be a numpy array") topmost = tuple(contour[contour[:, :, 1].argmin()][0]) bottommost = tuple(contour[contour[:, :, 1].argmax()][0]) return angle_between_points(topmost, bottommost)
[docs]def circle_area(radius): """ Calculates the area of a circle with the given radius. :param radius: The radius of the circle :return: Area of the circle """ return math.pi * (radius ** 2)
[docs]def distance_between_points(first_point, second_point): """ Calculates the Distance between 2 points. (x^2 + y^2) ^ 0.5 :param first_point: tuple of x and y value of point 1 :param second_point: tuple of x and y value of point 2 :return: Float value of the distance between the 2 points :rtype: float """ return ((first_point[0] - second_point[0]) ** 2 + (first_point[1] - second_point[1]) ** 2) ** 0.5
[docs]def regular_polygon_angle(side_amount: int) -> float: """ Returns the inner angle of a polygon with the given amount of sides :param side_amount: amount of sides the polygon has :return: """ return (side_amount - 2) * (180 / side_amount)
[docs]def polygon_area(side_length, amount_of_sides): """ area of a polygon of :param side_length: side_length of a side of the polygon :param amount_of_sides: Amount of sides the polygon has :return: the area of the polygon """ angle = 180 / amount_of_sides return 0.25 * amount_of_sides * (side_length ** 2) * (math.cos(math.radians(angle)) / math.sin(math.radians(angle)))
[docs]def law_of_cosine(first_point, second_point, third_point) -> float: """ Finds the angle BAC in degrees given that first_point = A second point = B and third point = C """ first_length = distance_between_points(first_point, second_point) second_length = distance_between_points(first_point, third_point) third_length = distance_between_points(second_point, third_point) angle = (first_length ** 2 + second_length ** 2 - third_length ** 2) / (first_length * second_length * 2) return math.degrees(angle)