Visualization in notebooks
It is possible to visualize pyddg objects in jupyter notebooks. For this we use the python package k3d.
Objects in this package can be displayed as interactive widgets in a jupyter notebook or in even in a static html page.
On the top right of the widgets there is a k3d panel that
allows to take screenshots, show the widget in fullscreen
or modify objects.
import ddg
import numpy as np
Converting pyddg objects to drawable objects
Default conversion
quadric = ddg.geometry.Quadric(np.diag((1, 1, -1, -1)))
To visualize this quadric as a smooth surface,
we first need to convert it to an instance of k3d.objects.Drawable.
hyperboloid = ddg.jupyter.convert(quadric)
type(hyperboloid)
k3d.objects.Group
k3d.objects.Drawable objects can be previewed direclty
when outputed from a jupyter cell:
hyperboloid
Special conversions
To convert to a k3d.objects.Drawable containing only the edges of an object, run:
hyperboloid_edges = ddg.jupyter.edges(quadric)
hyperboloid_edges
To get only the points of an object, run:
hyperboloid_points = ddg.jupyter.vertices(quadric)
hyperboloid_points
Visualizing a 3D scene
To create a 3D scene from k3d.objects.Drawable objects,
one must add them to a k3d.plot.Plot. We provide a utility function
to render them in a clean and higher quality render setting.
One can combine objects to create more complex scenes:
ddg.jupyter.show_3d(hyperboloid, hyperboloid_points, hyperboloid_edges)
Visualizing a 2D scene
To create a 2D scene, we provide a similar function:
I = (-1, 0, 1)
conics = [ddg.geometry.Quadric(np.diag((i, j, k))) for i in I for j in I for k in I]
kobjs = [ddg.jupyter.convert(c) for c in conics]
ddg.jupyter.show_2d(*kobjs)
Compared to 3D scenes, 2D scenes just have flat colors and the camera looks from the top by default.
Interactive visualization
One can make interactive visualizations using widgets,
like the ones from ipywigets.
Let’s make an empty plot for the visualization:
pencil = ddg.geometry.Pencil(quadric, ddg.geometry.Quadric(np.diag((1, 1, 1, -1))))
plot = ddg.jupyter.show_3d()
plot
Now let’s create a slider widgets and define a callback function that places a quadric in the scene for each value of the slider.
from ipywidgets import FloatSlider, interact
@interact(i=FloatSlider(value=0, min=-2, max=2))
def callback(i):
global plot
ddg.jupyter.clear_plot(plot)
quadric = pencil.quadric(i)
plot += ddg.jupyter.convert(quadric)
(The slider will take effect in the jupyter notebook, but not here in the docs.)