"""Elliptic geometry module.
This is the metric Cayley-Klein geometry with empty / positive definite absolute.
"""
import numpy as np
from ddg.geometry.geometry_model_templates import MetricCayleyKleinGeometry
from ddg.geometry.quadrics import Quadric
__all__ = ["ProjectiveModel"]
[docs]class ProjectiveModel(MetricCayleyKleinGeometry):
"""Elliptic geometry.
This is a Cayley-Klein geometry with empty absolute, so the model space is
all of RPn.
Parameters
----------
dimension : int
Attributes
----------
dimension : int
"""
@property
def absolute(self):
"""The absolute quadric with matrix ``diag([1,...,1])``.
Returns
-------
Quadric
"""
return Quadric(np.diag(np.ones(self.dimension + 1)))
[docs] @staticmethod
def metric_to_cayley_klein_distance(d):
"""Return Metric distance converted to Cayley-Klein "distance".
`K` is given by ::
K = cos(d) ** 2
Parameters
----------
d : float
Returns
-------
K : float
"""
return np.cos(d) ** 2
[docs] @staticmethod
def cayley_klein_distance_to_metric(K):
"""Return Cayley-Klein distance converted to metric distance.
`d` is given by the equation ::
d = arccos(sqrt(K))
Parameters
----------
K : float
Returns
-------
d : float
Raises
------
ValueError
If K is not in [0, 1]
"""
if not 0 <= K <= 1:
raise ValueError(
"Cayley-Klein distance must be in [0, 1] to correspond to a "
"metric distance in elliptic geometry."
)
return np.arccos(np.sqrt(K))
def __contains__(self, point):
return point.ambient_dimension == self.ambient_dimension