Source code for ddg.geometry.laguerre_models

"""Laguerre geometry module.

Contains model classes and functions for conversion between the models.
"""
import numpy as np

from ddg.geometry import lie_models
from ddg.geometry._quadrics import Quadric
from ddg.geometry._subspaces import Point, normal_with_level
from ddg.geometry.geometry_model_templates import CayleyKleinGeometry

__all__ = [
    "ProjectiveModel",
    "EuclideanModel",
    "euclidean_to_projective",
    "projective_to_euclidean",
]


[docs]class ProjectiveModel(CayleyKleinGeometry): """Projective / Blaschke cylinder model of Laguerre geometry. .. rubric:: Model space The model space is the quadric with matrix `diag([1,...,1, 0, -1])` without the point at infinity [0,...,0, 1 ,0]. .. rubric:: Representation of objects Points in this cylinder represent hyperplanes in R^n: In affine coordinates, they have a "direction" v and a "height" h. The point (v, h) corresponds to the hyperplane ``<x, v> = h.`` Parameters ---------- dimension : int Attributes ---------- dimension : int """ @property def absolute(self): """The absolute quadric with matrix ``diag([1,...,1, 0, -1])``. Returns ------- ddg.geometry.Quadric """ diag = np.ones(self.dimension + 2) diag[-2] = 0 diag[-1] = -1 return Quadric(np.diag(diag))
[docs] def lie(self): """Corresponding projective model of Lie geometry.""" return lie_models.ProjectiveModel(self.dimension)
[docs] def from_lie(self, object_, embedded=False): raise NotImplementedError
[docs] def to_lie(self, object_, embedded=False): raise NotImplementedError
def __contains__(self, point): return point in self.absolute def __str__(self): return f"Blaschke cylinder model of {self.dimension}D Laguerre geometry"
[docs]class EuclideanModel: """Euclidean model of Laguerre geometry. .. rubric:: Model space The model space is R^n. .. rubric:: Representation of objects Objects are represented by their Euclidean equivalents, mostly subspaces. """
[docs]def euclidean_to_projective(object_): """Convert from Euclidean model to Projective model / Blaschke cylinder. Parameters ---------- object_ : Subspace of dimension n-1 Returns ------- ddg.geometry.Point """ return Point([*normal_with_level(object_), 1])
[docs]def projective_to_euclidean(object_): """Convert from Projective model / Blaschke cylinder to Euclidean model. Parameters ---------- object_ : ddg.geometry.Point Returns ------- ddg.geometry.Subspace """ p = object_.point[:-1] return Point(p).dual()