rename area to polygon.area and add arg as str option

This commit is contained in:
2025-12-22 21:48:23 +01:00
parent 1fb8f5edd7
commit c0040539cd
3 changed files with 53 additions and 24 deletions

View File

@@ -1,3 +1,9 @@
# fvr # fvr
fvr; a suite of tools designed to enhance efficiency and productivity. fvr; a suite of tools designed to enhance efficiency and productivity.
Example usage:
- `fvr.geom.polygon(vertices).area`
- `fvr.wire.awg(number)`
- `fvr.wire.awg(number).diameter`
- `fvr.wire.awg(number).area`

View File

@@ -1,19 +1,40 @@
import re
from fvr.typing import FloatArray from fvr.typing import FloatArray
def area(vertices: FloatArray) -> float: class polygon:
r"""Determine the area of a simple polygon. def __init__(self, vertices: FloatArray|str):
r"""Properties of a simple polygon.
Args: Args:
vertices: List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]" vertices: List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]"
"""
if isinstance(vertices, str):
vertices = self.str2arr(vertices)
self.vertices = vertices
Shoelace formula, Gauss's area formula, surveyor's formula @staticmethod
def str2arr(vertices: str) -> list:
strm = re.match(r'\[.*\]', ''.join(vertices))
if strm and strm.group():
return eval(strm.group())
https://en.wikipedia.org/wiki/Shoelace_formula @property
""" def area(self) -> float:
count = len(vertices) # of corners r"""Determine the area of a simple polygon.
result = 0.0
for i in range(count): Example:
j = (i + 1) % count >>> fvr.geom.polygon([[0, 0], [0, 1], [1, 1], [1, 0]]).area
result += vertices[i][0] * vertices[j][1] - vertices[i][1] * vertices[j][0] >>> fvr.geom.polygon('[[0, 0], [0, 1], [1, 1], [1, 0]]').area
result = abs(result) / 2.0
return result Shoelace formula, Gauss's area formula, surveyor's formula
https://en.wikipedia.org/wiki/Shoelace_formula
"""
count = len(self.vertices) # of corners
result = 0.0
for i in range(count):
j = (i + 1) % count
result += self.vertices[i][0] * self.vertices[j][1] - \
self.vertices[i][1] * self.vertices[j][0]
result = abs(result) / 2.0
return result

View File

@@ -10,18 +10,20 @@ class awg:
number: AWG wire size, also '00', '000', '0000' number: AWG wire size, also '00', '000', '0000'
""" """
self.number = number self.number = number
self.num2int() self._number = self.num2int(number)
def num2int(self): @staticmethod
if isinstance(self.number, int): def num2int(number: int|str):
self._number = self.number if isinstance(number, int):
elif self.number.isdigit(): res = number
if self.number in ['00', '000', '0000']: elif number.isdigit():
self._number = 1 - len(self.number) if number in ['00', '000', '0000']:
res = 1 - len(number)
else: else:
self._number = int(self.number) res = int(number)
else: else:
raise ValueError raise ValueError(f"{number} is not a number.")
return res
@property @property
def diameter(self): def diameter(self):