Changelog

The format is based on Keep a Changelog. This project adheres to Semantic Versioning. Types of changes: Added, Changed, Deprecated, Removed, Fixed.

[0.4.2] - 2025-07-27

Added

  • examples: Added three new examples: Discrete cadenoid, Discrete Schwarz-P, and exponential ring patterns

  • halfedge: Added functions to integrate discrete one-forms: integrate_one_form and verify_closure_one_form

  • math: quad_grid_with_periodicity additionally outputs uv coordinates

  • ifs: grid_with_periodicity additionaly writes uv coordinates into attribute

Fixed

  • halfedge: Fix bug in bicolor_edges

  • halfedge: Fix in diagonals

  • obj: Add obj conversion to automatic import

  • obj: Fix regex to handle numbers with e notation

  • geometry: Fix error in TypeError for quadrics

[0.4.1] - 2025-04-25

Added

  • docs: Updated and extended freestyle docs.

Fixed

  • docs: Added conversion functions imported from private modules to all. This ensures that they appear in the sphinx API docs.

[0.4.0] - 2025-04-15

Added

  • conversion: New arguments added to the main conversion functions ddg.blender.convert, ddg.jupyter.convert, ddg.arrays.convert such as curve_sampling, surface_sampling, subspace_size, point_radius, curve_radius

  • conversion: All main conversion functions can handle all convertible (to arrays) types now.

  • conversion: Convertible (to arrays) types include SmoothNet now.

  • geometry: Added methods to switch between different geometries directly inside the classes.

Changed

  • blender: Blender conversion moved to ddg.blender.convert. See also ddg.blender.vertices, ddg.blender.edges, ddg.blender.scatter.

  • blender: ddg.blender.scatter has been slipt into ddg.blender.scatter and ddg.blender.vertices.

  • jupyter: Jupiter conversion moved to ddg.jupyter.convert. See also ddg.jupyter.vertices, ddg.jupyter.edges, ddg.jupyter.scatter.

  • arrays: Module ddg.conversion.arrays for conversion to array based datatypes moved to ddg.arrays. In particular the conversion function moved to ddg.arrays.convert.

  • geometry: Renamed dualize method of subspaces and quadrics to dual

  • geometry: Moved angle bisector and reflection functions to euclidean_models.ProjectiveModel

Removed

  • blender: Removed old blender conversion ddg.to_blender_object. Use ddg.blender.convert instead.

  • jupyter: Removed ddg.jupyter.k3d.to_tubes_and_spheres. Use ddg.jupyter.vertices and ddg.jupiter.edges instead.

  • geometry: Removed redundant ellipse_from_foci function from _quadrics

[0.3.1] - 2025-04-10

Fixed

  • installation: Fixed import error in ddg.jupyter due to missing dependencies

  • docs: Added jupyter installation guide

[0.3.0] - 2025-04-07

This is an intermediary version to major strucural and API changes in the visualization framework. It adds a new blender conversion framework (as a well a k3d visualization framework for jupyter). The old blender conversion is still contained, but all documentation and exmaples use the new one. The old blender conversion will be removed in the next minor version, and the API of the new one will be changed.

Added

  • blender: Added new blender conversion

    • The new main conversion function is given by ddg.blender.oject.to_blender_object_V2

    • In the current version it coxexists in parallel with the old function to_blender_oject, which will be complete removed in an upcoming version

    • Corresponding representations of vertices by spheres and edges by tubes are given by scatter and edges, which already replace all previous implementations of “tubes and spheres”

    • ddg.blender.object.array_to_object converts curves and meshes in numpy.ndarray representation to Blender objects

    • Multiple additions to blender.curve, blender.mesh, blender.object

    • New conversion is used in all examples

    • ddg.blender.props has been simplified accordingly

    • The documentation was changed to describe the new conversion mechanism

  • conversion: ddg.conversion.arrays._array converts most pyddg objects to curves and meshes in numpy.ndarray representation

    • The output is one of the following new internal basic data types: ddg.conversion.arrays.Points, ddg.conversion.arrays.Curve, ddg.conversion.arrays.CurveList, ddg.conversion.arrays.Mesh

    • This is the basis of the new blender conversion, yet completetly independent of blender, and will be the basis for any other visualization framework

  • blender: Added argument for the center in bmesh.cut_bounding_box

  • blender: Update to Blender 3.6 LTS

  • blender: Added module for freestyle setups ddg.blender.freestyle

  • blender: Added conversion for QuadricIntersection of dimension 1.

  • jupyter: Added visualization for jupyter notebooks

  • errors: An ad-hoc mechanism for error messages was introduced in ddg._error_messages

  • docs: Added more snapshot tests

  • docs: Added entry on reflection in hyperplane

  • docs: Included changelog into docs

  • docs: Added entry on math modules

  • docs: Revised tutorial

  • examples: Added reflection in hyperplane

  • math: Additions from clean up of inner_product include:

    • Added col_complement_oriented / row_complement_oriented, which ensure positive determinant, and correspondingly dualize_oriented and polarize_oriented

    • Added vectorize_inner_product

  • math: Added examples to docstrings

  • math: Added quad_grid_sandwich to create vertices and faces of quad grids with sandwich combinatorics

  • math: Added subdivision by fan triangulation triangulated_faces

  • geometry: Added __str__ for geometries

  • halfedge: Added arguments to halfedge.copy: original_vetex_attr, original_edge_attr, original_face_attr

  • geometry: Added the SphericalModel to elliptic geometry

  • geometry: Added the ability to pass lower-dimensional spheres to lift_sphere_to_quadric

  • geometry: Added sphere_through_points and orthogonal_sphere to Euclidean, hyperbolic and elliptic geometry

  • geometry: Added radical_subspace to Euclidean geometry

  • geometry: Added docstring for projection dispatcher

  • geometry: Added QuadricIntersection class to represent intersections of quadrics

  • geometry: Added extensive functionalities to Pencil for classification

  • geometry: Added SignatureSequence, IndexSequence, and SegreSymbol for pencil classification

  • geometry: Added functions to generate quadrics from inital data: ellipse_from_foci, quadric_from_points, quadric_from_three_skew_lines

  • ifs: Added grid_sandwich to create grids with sandwich combinatorics

  • ifs: Added dualize for combinatorial dualization of IFS

  • ifs: Added mean_values_on_faces to create attribute on faces by taking the mean of an attribute on incident vertices

  • ifs: Added __eq__ for ddg.indexedfaceset.OrientedFace to check for equality of tuples up to cyclic permutation

  • ifs: Added sample_domain to create grids as samplings from rectangular domains (with periodicities)

  • ifs: Added transform_attribute to apply transformations to IFS attributes

  • tests: Add helpful messages to test.py whenever tests fail

Changed

  • docs: Introduced docs/source/conf.py which contains versions and other variables for the docs

  • docs: Improved section on getting started with blender

  • math: Clean up of inner_product including:

    • Renamed get_col_complement -> col_complement, get_row_complement -> row_complement

    • Renamed points_on_quadric_from_onb -> light_like_vectors_from_onb

    • Vectorized all functions

  • math: Moved all parametrizations (circle, sphere, torus, …) into math.parametrizations

  • docs: Restructered some sections

  • docs: Added section on math module

  • docs: Fefactor visualization users guide and fix spheres visualization guide, removed docstring.txt

  • build: Tag script does not push to develop

  • build: Test script does not build all versions of docs by default

  • build: Treat warings as error in docs build

  • build: Show traceback of errors in docs build

  • geometry: Simplified intersect and join functions

  • geometry: Moved all classes related to signatures to ddg.geometry.signatures

Removed

  • blender: Removed tubes and spheres representations for half-edge - These have been replaced by scatter and edges of the new blender conversion mechanism - Removed have been vertex_objects, edge_objects, vertex_spheres, edge_tubes, hes_to_tubes_and_spheres_blender_object

  • blender: Removed overwrite_callback, hide_callback, clear_callback - Replaced by hide_previous and mechanisms which do not rely on any of those functions

Fixed

  • docs: Fixed version panel for deep pages

  • geometry: Fixed conversion of quadric to Euclidean sphere for spheres of radius 0

  • geometry: Fixed conversion of sphere to smooth net for dimensions not equal to 1 or 2

  • ifs: Fixed neighboring_faces returning faces with multiple common edges multiple times

  • blender: Fix in intersection: Fixed zig zag lines and missing intersections in multiple component intersections

  • tests: Fixed ignored tests for IFS in test_utils

[0.2.1] - 2024-05-23

Added

  • math: Added energy module with some discrete local energies

  • docs: Add example in docstring for collection

Changed

  • tests: More flexible snapshot test mechanism

    • Snapshot test funcionality moved from snapshot to snapshots

    • Replaced opt_in by explicit tests located testing/tests/examples/blender/test_examples.py

  • halfedge: Creation of surfaces redone by using ifs_generator and converting the resurt to halfedge

    • Some funcions and arguments have been changed in the process

  • ifs: The Grid subclass of IndexedFaceSet was removed

    • Its functionality is replaced by ddg.indexedfaceset.grid_with_periodicity and other already existing functions of _ifs_generator

  • blender: New defaults for setup_eevee_renderer and setup_cycles_renderer

Fixed

  • docs: Corrected link to docs in readme

  • docs: Doc string corrections in math

  • docs: Corrected link to develop docs online

  • tests: Coverage fixes for blender tests

  • nets: Fixed shrink_domain for DiscreteInterval

[0.2.0] - 2024-05-06

Added

  • docs: Multiple versions of the docs available online

  • build: New mechanism to build all doc versions

Changed

  • major changes to the package structure and imports

    • Removed visualization and datastructures from the package structure

    • Pulled up most of the module contents geometry

    • Pulled up most of the module contents in halfedge, indexedfaceset, nets

    • Some modules became private during the pull up, some functions and classes were renamed in the process

[0.1.9] - 2024-04-29

Added

  • blender: Some additions to render_frame and render_animation

    • Added default render path

    • Automatically add file extension

    • Respect image output properties set in set_render_output_images

  • docs: Section for Blender tips and tricks and a guide on Blender crashing

  • examples: Exercise on envelopes and orth trajectories for families of circles

  • examples: Exercise on caustics

  • examples: Exercise on channel surfaces

  • tests: Activated some doctests by removing SKIP flags

  • build: Building docker images with GitLab CI

Changed

  • docs: Moved sampling guide examples from domain to nets

  • geometry: Restructured Transformable so that X.transform() does not mutate X anymore and returns a transformed copy instead

  • geometry: In Subspace and Quadric the matrix is cast to dtype float

  • geometry: Pencil now has method matrix(u), which supports complex matrices, while quadric(u) only supports real quadrics.

  • blender: Some clean up of blender utils. This includes renaming the attributes of some functions. In particular type -> type_.

  • tests: Blender tests raise ImportError if and only if bpy cannot be imported

  • Replaced automagic importing with explicit imports

Fixed

  • examples: Fixed AttributError in curvature circles

[0.1.8] - 2024-01-10

Added

  • examples: Elliptic billiards example

  • examples: Cycloidal pendulum example

  • geometry: Add subspace function reflect_in_hyperplane

Changed

  • geometry: Introduced new geometry concept

    • Module for each geometry ddg.geometry.*_models, which contain classes for each model and conversion between different models.

    • Projective models also available as ddg.geometry.*()

    • Spheres are created by factory methods from inside the geometry model classes

    • New interfaces in ddg.geometry.abc

    • embed and coordinates are now embed and unembed

[0.1.7] - 2024-01-08

Added

  • examples: Curvature cirlces example with animation

  • docs: Added docs on Blender’s Python API for selections

  • blender: Some additions to the new Blender conversion API

  • optimize: IFS optimization

Changed

  • docs: Improved rendering users guide

  • docs: Improved animations users guide

  • docs: Revised guide on scripting in blender

  • docs: Improved sampling users guide

[0.1.6] - 2023-11-30

Added

  • tests: Snapshot tests for blender examples.

  • examples: Evolutes and involutes of curves.

  • conversion: Added conversion from datastructures and geometry object to arrays as first step of revised blender conversion

  • nets: Add test for periodicity of circles

Changed

  • examples: Updated Moebius pencil example

  • blender: Setting values of BSDF materials

  • docs: Improved materials and rendering user’s guide

Fixed

  • geometry: Fixed docstring

[0.1.5] - 2023-11-15

Added

  • docs: Net visualization examples with cut_bounding_box

  • math: Added angle, length bisectors, and reflection matrices

  • geometry: Added orthonormalize_and_center for subspaces

  • geometry: Added functions for angle bisectors and perpendicular bisectors

  • Added module nonexact to replace NonExact class and nonexact_function decorator

Changed

  • examples: Updated shadow of an ellipsoid example

  • Replaced NonExact class and nonexact_function decorator with functions from nonexact module for elementary nonexact computations that use the global defaults.

  • examples: Updated triangles in perspective

  • tests: Doctests are now run with pytest instead of sphinx.ext.doctest

Fixed

  • docs: Windows installation

  • tests: Fix and speed up benchmark_touching_cones

Removed

  • blender: Removed mesh selection functions

  • Removed NonExact class and nonexact_function decorator to be replaced by nonexact module

[0.1.4] - 2023-10-23

Added

  • nets: Added utils.compose function to replace the method transform

  • docs: Included some geometry visualization exercises

Changed

  • nets: Net utils such as homogenize and dehomogenize now return the resulting net instead of transforming it

  • nets: The use of the method transform is replaced by utils.compose everywhere

  • docs: Improved documentation index

  • docs: Revised blender users guide

  • docs: Improved conversion documentation

  • blender: Rewrote mesh.intersection_curve and renamed to mesh.intersection

  • ifs: Cleanup and improvements to ifs_generator

  • math: Renamed geometric_objects to discrete_objects (with cleanup and improvements)

  • dev: Made test modules start with test_ and test classes start with Test

  • dev: Set ipython debugger as default

  • tests: Speed up ic-nets test

Removed

  • blender: Removed some dead Blender code

Fixed

  • blender: Fixed mesh.intersection_curve which is now called mesh.intersection

[0.1.3] - 2023-07-31

Added

  • docs: Added logo and favicon

  • docs: Installation guide for macOS

  • docs: Added local TOCs

  • docs: How to manage dependencies with Poetry

  • tests: flake8 option added to test script: test.py –lint

  • build: flake8 runs in the pipeline, and makes it fail for certain errors the corresponding errors have been fixed throughout the code

  • ifs: Added Grid class as subclass of NgonalIndexedFaceSet

  • math: Added parametrizations for torus and mobius strip

  • blender: Added functions to create and animate transparent materials

  • blender: Added functions to set background images and videos

  • blender: Added module context that provides context manager mode to set mesh select modes

  • blender: Added context manager bmesh.bmesh_from_mesh to create a bmesh

  • blender: Added object.get_data

  • blender: Added module render for rendering setup

  • geometry: Added functions to create random subspaces

Changed

  • tests: Use a new rng fixture in all tests

  • math: Some clean up and renaming in euclidean and euclidean2d

  • docs: Use labels instead of line numbers for literalinclude

  • docs: Single backtick snippets are now interpreted as Python snippets

  • docs: Respect maximum line length of 88 in docstrings

  • ci: Use self-hosted docker images

  • ifs: Adapted ifs generators grid and cylinder to use Grid class

  • blender: Small changes in light

  • blender: Docstring clean up in object

  • blender: Adjusted behaviour of mesh.transform, mesh.join, mesh.shade_smooth

Fixed

  • build: Avoid adding new files when using tagging script

  • build: Typos in test script

  • geometry: Small fixes and refactoring of Quadrics and affine_normalization (including 1x1 matrix support)

Removed

  • blender: Removed object.move_to_layer

[0.1.2] - 2023-04-23

Added

  • examples: Shadow of an ellipsoid

  • geometry.subspaces: least_square_subspace_from_affine_points

  • math.grids: triangulate_quads, triangle_grid, triangulated_quad_grid

  • docs: Added / updated sections in the developer’s guide

Changed

  • geometry.quadrics: Improved Quadric.__str__

  • geometry.intersection: Restructure meet and join. Improved dispatching and documentation.

  • blender.object: Clean up. Renamed and removed several functions.

  • blender.clear: Removed the clear module and distributed the clear functions to the resp. modules

  • conversion: Relocated and cleaned obj_to_ifs, ifs_to_obj, obj_to_hds, hds_to_obj

  • Clean up of init files

  • docs: Changed to read the docs style

Fixed

  • math.euclidean: Various small fixes. In particular, adding @NonExact.nonexact_function to some functions

  • geometry.quadrics: Improved Pencil symbolic roots computation

  • geometry.subspaces: Fixed least_square_subspace

  • tests: Fixed test discovery to include *_test.py and *Test again

[0.1.1] - 2023-01-24

Added

  • tests: Add style check by black

  • examples: Conics from circles with animation

  • geometry: ddg.geometry.quadrics.ellipse_from_foci

  • math.euclidean: intersect_diags, distance_lines

  • math.linalg: minors

  • blender: Functions to save and load blender properties save_props and load_props

  • conversion.nets: In all *_to_smooth_net functions the default values are changed to affine=True and convex=True

  • tests: Add pytest fixture to clean up scene before and after each blender test

Changed

  • style: All files have been reformatted by black

  • tests: Change all tests from unittest to pytest style

  • blender: The following functions were moved from ddg.visualization.blender.object to ddg.visualization.blender.mesh and any add_ or create_ preffixes were removed: duplicate_by_properties, duplicated_by_transformation_matrices, duplicate_linked, join, connected_components, intersection_curve, selected_vertices_of_active_object

  • math.euclidean2d: As part of a general cleanup the following functios were renamed diagonals_intersection -> intersect_diags, vertex_angle_with_sign -> vertex_angle_signed, circumcircle_center -> circumcenter, circumcircle_radius -> circumradius, coordinates_on_circle_from_cross_ratio -> fourth_point_from_cross_ratio

  • math.linalg: General cleanup

  • conversion.nets: Improved subspace conversion. Extracted functions parametrize_subspace_convex and parametrize_subspace_homogeneous

  • docs: Improved docs on geometric object visualization

[0.1.0] - 2022-12-06

Added

  • geometry: Added functions embed and coordinates methods to geometry.Quadric and geometry.Subspace to raise and lower the dimension of their ambient space.

  • geometry: Added coordinate_hyperplane to geometry.subspaces

  • math: Added functions to create and decompose affine and similarity maps in homogeneous coordinates to math.projective: affine_map, decompose_affine_map, similarity_map, decompose_similarity_map, and a function to change between affine pictures: affine_component_transformation

  • build: Added dependency: deprecation

  • Added ddg.__version__ string

  • tests: Automatic tests of examples in examples/blender/geometry/

  • geometry: Method change_affine_picture to change affine coordinates added to LinearTransformable

  • examples: Added some blender geometry examples:

    • lines in a projective plane,

    • three triangles in perspective,

    • cross-ratio of a tetrahedron

  • blender: Added functions to create duplicate linked objects. In particular for each cell of a half-edge surface. The funcions vertex_spheres and edge_tubes replace hes_to_tubes_and_spheres_blender_object

Changed

  • geometry: All projection functions moved from geometry.conversion to geometry.projection

  • datastructures: Various improvements to ifs_generator docstrings

  • docs: Flattened ddg.geometry user’s guide outline

Deprecated

  • hes_to_tubes_and_spheres_blender_object will be removed in v0.2.0. Use vertex_spheres and edge_tubes instead.

Fixed

  • visualization: Small fixes in blender.material utils: Return blender object, and allow any sequence setting color.

Removed

  • geometry: Removed affine_component arguments from all functions and objecst, and replaced it with the “last component” convention. The method change_affine_picture can be used instead.

[0.0.3] - 2022-11-14

Added

  • docs: First tutorial

  • ifs: Added grid and triangle_grid to ifs_generator

Changed

  • build: Improved tag script

  • math: Renamed some functions in math.complex: diagonals_intersection->intersect_diags, circumcircle_center -> circumcenter, circumcircle_radius -> circumradius

  • math: Moved math.complex.triangle_area_from_length -> math.euclidean2d.triangle_area

  • Removed trailing whitespace

  • blender: Renamed some functions in visualization.blender.mesh: bisect_plane -> cut_half_plane, cut_between_coordinate_planes -> cut_between_coordinate_half_spaces

Removed

  • Removed some updategraph remains

Fixed

  • docs: Windows and macOS installation guide

  • docs: Added missing import in tutorial

  • docs: Fixed blender visualization docs

[0.0.2] - 2022-10-20

Added

  • math: Scale rotation between two vectors: ddg.math.euclidean.scale_rotation_from_to

  • build: Recursively import all submodules

  • docs: Support section,

  • docs: Blender rendering guide

Changed

  • Moved numpy version up to 1.22

  • blender: object.add_root moved to mesh._root

  • docs: New introduction

  • docs: Moved constributers installation to developers guide

  • docs: Improved Blender properties guide

  • docs: Improved installation guide

Fixed

  • math: ddg.math.euclidean.rotation_from_to now returns 180 degree rotation for anti-parallel vecters and does not scale vectors

[0.0.1] - 2022-10-18

Added

  • blender: Function to create Blender Principled BSDF material: ddg.visualization.blender.material.material

  • blender: Function to set matrix_world of Blender object: ddg.visualiaziotn.blender.object.set_matrix_world

Changed

  • docs: Update installation guide.

  • build: Improved tag script.

[0.0.0] - 2022-10-17

  • initial release