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; 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
def area(vertices: FloatArray) -> float:
r"""Determine the area of a simple polygon.
class polygon:
def __init__(self, vertices: FloatArray|str):
r"""Properties of a simple polygon.
Args:
vertices: List of points, pair of x and y: "[[x1, y1], [x2, y2], ...]"
"""
if isinstance(vertices, str):
vertices = self.str2arr(vertices)
self.vertices = vertices
@staticmethod
def str2arr(vertices: str) -> list:
strm = re.match(r'\[.*\]', ''.join(vertices))
if strm and strm.group():
return eval(strm.group())
@property
def area(self) -> float:
r"""Determine the area of a simple polygon.
Example:
>>> fvr.geom.polygon([[0, 0], [0, 1], [1, 1], [1, 0]]).area
>>> fvr.geom.polygon('[[0, 0], [0, 1], [1, 1], [1, 0]]').area
Shoelace formula, Gauss's area formula, surveyor's formula
https://en.wikipedia.org/wiki/Shoelace_formula
"""
count = len(vertices) # of corners
count = len(self.vertices) # of corners
result = 0.0
for i in range(count):
j = (i + 1) % count
result += vertices[i][0] * vertices[j][1] - vertices[i][1] * vertices[j][0]
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'
"""
self.number = number
self.num2int()
self._number = self.num2int(number)
def num2int(self):
if isinstance(self.number, int):
self._number = self.number
elif self.number.isdigit():
if self.number in ['00', '000', '0000']:
self._number = 1 - len(self.number)
@staticmethod
def num2int(number: int|str):
if isinstance(number, int):
res = number
elif number.isdigit():
if number in ['00', '000', '0000']:
res = 1 - len(number)
else:
self._number = int(self.number)
res = int(number)
else:
raise ValueError
raise ValueError(f"{number} is not a number.")
return res
@property
def diameter(self):