# Triangle Strips
# ===============

# This example shows how to build a simple `pyvista.PolyData` using
# triangle strips.
# Triangle strips are a more efficient way of storing the connectivity of
# adjacent triangles.
import numpy as np
import pyvista as pv

# Create an array of points
points = np.array(
    [
        [1.0, 0.0, 0.0],
        [0.0, 0.0, 0.0],
        [1.0, 1.0, 0.0],
        [0.0, 1.0, 0.0],
        [1.0, 2.0, 0.0],
        [0.0, 2.0, 0.0],
        [1.0, 3.0, 0.0],
        [0.0, 3.0, 0.0],
    ],
)

# Build the connectivity of the strips
# ====================================

# The first element is the number of points in the strip next three elements is the
# initial triangle the rest of the points is where the strip extends to.
strips = np.array([8, 0, 1, 2, 3, 4, 5, 6, 7])


# build the mesh
mesh = pv.PolyData(points, strips=strips)
mesh

# Plot the triangle strips
# ========================

# Plot the `PolyData` and include the point labels using
# `add_point_labels()` so we can see how
# the PolyData is constructed using triangle strips.
pl = pv.Plotter()
pl.add_mesh(mesh, show_edges=True)
pl.add_point_labels(mesh.points, range(mesh.n_points))
pl.camera_position = 'yx'
pl.camera.zoom(1.2)
pl.show()

# Convert strips to triangles
# ===========================

# You can convert strips to triangle faces using `triangulate`.
trimesh = mesh.triangulate()
trimesh

# We can use this new `pyvista.PolyData` to see how VTK represents
# triangle strips as individual faces.
# See how the faces array is much larger (~3x more) even for this basic example
# even despite representing the same data.

# NOTE:
#     The faces array from VTK always contains padding (the number of points in
#     the face) for each face in the face array. This is the initial `3` in
#     the following face array.

faces = trimesh.faces.reshape(-1, 4)
faces

# Convert triangles to strips
# ===========================

# Convert faces from a `pyvista.PolyData` to strips using `strip()`. Here, for demonstration purposes we convert the
# triangulated mesh back to a stripped mesh.
restripped = trimesh.strip()
restripped

# The output from the `strip` filter is, as expected, identical to the
# original `mesh`.
restripped == mesh

# ----------------------------------------------------------------------
# Generated by sphinx-examples-as-code https://github.com/pyvista/sphinx-examples-as-code

