rename area to polygon.area and add arg as str option
This commit is contained in:
@@ -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`
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
@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
|
Shoelace formula, Gauss's area formula, surveyor's formula
|
||||||
|
|
||||||
https://en.wikipedia.org/wiki/Shoelace_formula
|
https://en.wikipedia.org/wiki/Shoelace_formula
|
||||||
"""
|
"""
|
||||||
count = len(vertices) # of corners
|
count = len(self.vertices) # of corners
|
||||||
result = 0.0
|
result = 0.0
|
||||||
for i in range(count):
|
for i in range(count):
|
||||||
j = (i + 1) % 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
|
result = abs(result) / 2.0
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user