diff --git a/cjio/geom_help.py b/cjio/geom_help.py index b66214c..950f8c9 100755 --- a/cjio/geom_help.py +++ b/cjio/geom_help.py @@ -35,6 +35,9 @@ def get_normal_newell(poly): n = np.array([0.0, 0.0, 0.0], dtype=np.float64) # if len(poly) == 0: # print ("NOPOINTS") + if len(poly) < 3: + return n, False + for i,p in enumerate(poly): ne = i + 1 if (ne == len(poly)): diff --git a/tests/test_geom_help.py b/tests/test_geom_help.py new file mode 100644 index 0000000..404942b --- /dev/null +++ b/tests/test_geom_help.py @@ -0,0 +1,57 @@ +import typing as t + +import numpy as np +import numpy.typing as npt +import pytest + +from cjio.geom_help import get_normal_newell + + +@pytest.mark.parametrize( + ["poly", "expected_normal"], + [ + ( + [ + [2195013, 353200, 12283], + [2195013, 353200, 8680], + [2182302, 347931, 8680], + [2182302, 347931, 12159], + [2182302, 347931, 12178], + ], + np.array([-0.38292729, 0.92377848, 0.0]), + ), + ( + [ + [2203406, 332904, 12622], + [2203406, 332904, 8680], + [2204954, 333543, 8680], + [2204954, 333543, 12223], + [2204954, 333543, 12584], + ], + np.array([0.38156054, -0.92434385, 0.0]), + ), + ], +) +def test_get_normal_valid_poly(poly: t.List[t.List[int]], expected_normal: npt.NDArray[t.Any]) -> None: + normal, success = get_normal_newell(poly=poly) + assert success + np.testing.assert_almost_equal(actual=normal, desired=expected_normal) + + +@pytest.mark.parametrize( + ["poly", "expected_normal"], + [ + ( + [[1041, 1009, 1025, 1054, 1087]], + np.array([0.0, 0.0, 0.0]), + ), + ( + [[[1099, 1098]]], + np.array([0.0, 0.0, 0.0]), + ), + ], +) +def test_get_normal_invalid_poly(poly: t.List[t.List[int]], expected_normal: npt.NDArray[t.Any]) -> None: + normal, success = get_normal_newell(poly=poly) + assert not success + np.testing.assert_almost_equal(actual=normal, desired=expected_normal)