# Computing Surface Normals
# =========================

# Compute normals on a surface.
import numpy as np

from pyvista import examples

# Computing the normals of a surface is quite easy using
# `pyvista.PolyData`'s `pyvista.PolyDataFilters.compute_normals()`
# method.
mesh = examples.download_topo_global()
mesh.plot(cmap='gist_earth', show_scalar_bar=False)

# Now we have a surface dataset of the globe loaded - unfortunately, the
# dataset shows the globe with a uniform radius which hides topographic relief.
# Using `pyvista.PolyDataFilters.compute_normals()`, we can compute the normal
# vectors on the globe at all points in the dataset, then use the values given
# in the dataset to warp the surface in the normals direction to create some
# exaggerated topographic relief.
# Compute the normals in-place and use them to warp the globe
mesh.compute_normals(inplace=True)  # this activates the normals as well

# Now use those normals to warp the surface
warp = mesh.warp_by_scalar(factor=0.5e-5)

# And let's see it
warp.plot(cmap='gist_earth', show_scalar_bar=False)

# We could also use face/cell normals to extract all the faces of a mesh
# facing a general direction. In the following snippet, we take a mesh, compute
# the normals along its cell faces, and extract the faces that face upward.
mesh = examples.download_washington_bust()
# Compute normals
mesh.compute_normals(cell_normals=True, point_normals=False, inplace=True)

# Get list of cell IDs that meet condition
ids = np.arange(mesh.n_cells)[mesh['Normals'][:, 2] > 0.0]

# Extract those cells
top = mesh.extract_cells(ids)

top.plot(color=True)

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

