Browse Source

added PolygonalChain.adjacent_vertex_indices()

Fabian Peter Hammerle 5 years ago
parent
commit
14e6513dbf

+ 2 - 5
examples/precentral_gyrus_border.ipynb

@@ -63,18 +63,15 @@
    },
    "outputs": [],
    "source": [
-    "import itertools, numpy\n",
+    "import numpy\n",
     "from freesurfer_surface import Vertex, Triangle\n",
     "\n",
-    "def slice_offset(iterable, offset):\n",
-    "    return itertools.islice(iterable, offset, len(iterable))\n",
-    "\n",
     "def unit_vector(vector: numpy.array) -> numpy.array:\n",
     "    return vector / numpy.linalg.norm(vector)\n",
     "\n",
     "BORDER_WIDTH = 0.8 # mm\n",
     "\n",
-    "for vertex_triplet_indices in zip(*(slice_offset(border_chain.vertex_indices, o) for o in range(3))):\n",
+    "for vertex_triplet_indices in border_chain.adjacent_vertex_indices(3):\n",
     "    vertex_triplet = [surface.vertices[idx] for idx in vertex_triplet_indices]\n",
     "    backward_vector = vertex_triplet[0] - vertex_triplet[1]\n",
     "    forward_vector = unit_vector(vertex_triplet[2] - vertex_triplet[1]) * BORDER_WIDTH / 2\n",

+ 8 - 2
freesurfer_surface/__init__.py

@@ -189,9 +189,15 @@ class PolygonalChain:
         else:
             raise PolygonalChainsNotOverlapingError()
 
+    def adjacent_vertex_indices(self, vertices_num: int = 2
+                                ) -> typing.Iterable[typing.Tuple[int]]:
+        return zip(*(itertools.islice(self.vertex_indices,
+                                      offset,
+                                      len(self.vertex_indices))
+                     for offset in range(vertices_num)))
+
     def segments(self) -> typing.Iterable[_LineSegment]:
-        indices = self.vertex_indices
-        return map(_LineSegment, zip(indices, itertools.islice(indices, 1, len(indices))))
+        return map(_LineSegment, self.adjacent_vertex_indices(2))
 
 
 class Label:

+ 27 - 0
tests/test_polygonal_chain.py

@@ -68,6 +68,33 @@ def test_connect_fail_empty(vertex_indices_a, vertex_indices_b):
         chain.connect(PolygonalChain(vertex_indices_b))
 
 
+def test_adjacent_vertex_indices_1():
+    chain = PolygonalChain((0, 1, 4, 8))
+    pairs = list(chain.adjacent_vertex_indices(1))
+    assert len(pairs) == 4
+    assert pairs[0] == (0,)
+    assert pairs[1] == (1,)
+    assert pairs[2] == (4,)
+    assert pairs[3] == (8,)
+
+
+def test_adjacent_vertex_indices_2():
+    chain = PolygonalChain((0, 1, 4, 8))
+    pairs = list(chain.adjacent_vertex_indices(2))
+    assert len(pairs) == 3
+    assert pairs[0] == (0, 1)
+    assert pairs[1] == (1, 4)
+    assert pairs[2] == (4, 8)
+
+
+def test_adjacent_vertex_indices_3():
+    chain = PolygonalChain((0, 1, 4, 8))
+    pairs = list(chain.adjacent_vertex_indices(3))
+    assert len(pairs) == 2
+    assert pairs[0] == (0, 1, 4)
+    assert pairs[1] == (1, 4, 8)
+
+
 def test_segments():
     chain = PolygonalChain((0, 1, 4, 8))
     segments = list(chain.segments())