Source code for pymead.utils.geometry
import typing
import numpy as np
from shapely.geometry import LineString
[docs]
def check_airfoil_self_intersection(coords: typing.Tuple[tuple]):
"""Determines whether the airfoil intersects itself using the `is_simple()` function of the
`shapely <https://shapely.readthedocs.io/en/stable/manual.html>`_ library.
Parameters
==========
coords: typing.Tuple[tuple]
Set of :math:`x`-:math:`y` coordinates representing the airfoil shape, where each inner tuple is an
:math:`x`-:math:`y` pair.
Returns
=======
bool
Describes whether the airfoil intersects itself
"""
line_string = LineString(coords)
is_simple = line_string.is_simple
return not is_simple
[docs]
def convert_numpy_array_to_shapely_points(arr: np.ndarray):
"""
Converts a 2-D numpy array of :math:`x`-:math:`y` coordinates to the format used by the
`shapely <https://shapely.readthedocs.io/en/stable/manual.html>`_ library.
Parameters
==========
arr: np.ndarray
2-D array of :math:`x`-:math:`y` coordinates
Returns
=======
typing.List[tuple]
List of tuples where each tuple represents an :math:`x`-:math:`y` coordinate pair
"""
return list(map(tuple, arr))
[docs]
def convert_numpy_array_to_shapely_LineString(arr: np.ndarray):
"""
Converts a 2-D numpy array of :math:`x`-:math:`y` coordinates to a
`LineString <https://shapely.readthedocs.io/en/stable/reference/shapely.LineString.html>`_.
Parameters
==========
arr: np.ndarray
2-D array of :math:`x`-:math:`y` coordinates
Returns
=======
shapely.geometry.LineString
Geometric object defined by a set of points connected, in order, by lines.
"""
return LineString(list(map(tuple, arr)))
[docs]
def map_angle_m180_p180(v: float):
"""
Maps an angle from any value in radians to the range :math:`[-pi, pi]`
Parameters
==========
v: float
Angle in radians
Returns
=======
float
Angle in radians between :math:`-pi` and :math:`pi`, inclusive
"""
v = v % (2 * np.pi)
if v > np.pi:
v -= 2 * np.pi
return v
[docs]
def calculate_area_triangle_heron(a: float, b: float, c: float):
"""
Heron's formula for area of a triangle
Parameters
==========
a: float
Side length 1
b: float
Side length 2
c: float
Side length 3
Returns
=======
float
Area of the specified triangle
"""
s = (a + b + c) / 2
return np.sqrt(s * (s - a) * (s - b) * (s - c))