Coverage for src \ pavpen \ geometry_calculator \ vector_field_implementations \ tuple_float_vector_field_operations.py: 100%
24 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-27 03:59 -0400
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-27 03:59 -0400
1# SPDX-FileCopyrightText: 2026-present Pavel M. Penev <pavpen@gmail.com>
2#
3# SPDX-License-Identifier: MIT
5from typing import cast
7from pavpen.geometry_calculator.float_vector_field_operations import FloatVectorFieldOperations
10class TupleFloatVectorFieldOperations[Vector: tuple[float, ...]](FloatVectorFieldOperations[Vector]):
11 """Treats tuples of floats as vectors in an orthonormal space"""
13 @staticmethod
14 def for_1d() -> "TupleFloatVectorFieldOperations[tuple[float]]":
15 return TupleFloatVectorFieldOperations[tuple[float]](component_count=1)
17 @staticmethod
18 def for_2d() -> "TupleFloatVectorFieldOperations[tuple[float, float]]":
19 return TupleFloatVectorFieldOperations[tuple[float, float]](component_count=2)
21 @staticmethod
22 def for_3d() -> "TupleFloatVectorFieldOperations[tuple[float, float,float]]":
23 return TupleFloatVectorFieldOperations[tuple[float, float, float]](component_count=3)
25 def __init__(self, component_count: int) -> None:
26 super().__init__()
27 self._component_count = component_count
29 @property
30 def additive_identity(self) -> Vector:
31 return cast("Vector", (0,) * self._component_count)
33 def added(self, addend1: Vector, addend2: Vector) -> Vector:
34 return cast(
35 "Vector",
36 tuple(coordinate1 + coordinate2 for coordinate1, coordinate2 in zip(addend1, addend2, strict=False)),
37 )
39 def scaled(self, multiplicand: Vector, scalar: float) -> Vector:
40 return cast("Vector", tuple(coordinate * scalar for coordinate in multiplicand))
42 def inner_multiplied(self, multiplicand1: Vector, multiplicand2: Vector) -> float:
43 return sum(
44 coordinate1 * coordinate2 for coordinate1, coordinate2 in zip(multiplicand1, multiplicand2, strict=False)
45 )