import numpy as np
from ddg.math.functions import K, cd, cn, cs, dc, dn, ds, nc, nd, ns, sc, sd, sn
[docs]def confocal_coordinates_elliptic(a, b, c):
"""a > b > c"""
k1 = np.sqrt((a - b) / (a - c))
k2 = np.sqrt(1 - k1**2)
k3 = k1
intervals = [[0.0, 4 * K(k1), True], [0.0, 4 * K(k2), True], [0.0, 2 * K(k3)]]
def fct(s1, s2, s3):
A = np.sqrt(a - c)
k1 = np.sqrt((a - b) / (a - c))
k2 = np.sqrt(1 - k1**2)
k3 = k1
return np.array(
(
A * sn(s1, k1) * dn(s2, k2) * ns(s3, k3),
A * cn(s1, k1) * cn(s2, k2) * ds(s3, k3),
A * dn(s1, k1) * sn(s2, k2) * cs(s3, k3),
)
)
return (fct, intervals)
[docs]def confocal_coordinates_circles_normalized(a, b, c):
def sqrt(x):
if x < 0.0:
return 0.0
else:
return np.sqrt(x)
s0 = np.arccos(sqrt((a - b) / (a - c)))
intervals = [[s0, np.pi - s0], [-s0, s0], [0, np.pi / 2]]
def fct(s1, s2, s3, a=a, b=b, c=c):
A = (a - c) / (sqrt((a - b) * (b - c)))
B = 1 / (sqrt((a - b) * (b - c)))
C = (a - c) / (sqrt((a - b) * (b - c)))
def f1(s1, s2, s3):
return A * np.cos(s1) * np.cos(s2) * np.cos(s3)
def f2(s1, s2, s3, a=a, b=b, c=c):
return (
B
* sqrt(a - b - (a - c) * np.cos(s1) ** 2)
* sqrt((a - c) * np.cos(s2) ** 2 - a + b)
)
def f3(s1, s2, s3):
return C * np.sin(s1) * np.sin(s2) * np.sin(s3)
return np.array((f1(s1, s2, s3), f2(s1, s2, s3), f3(s1, s2, s3)))
return (fct, intervals)
[docs]def minkowski_confocal_coordinates(k):
KK = K(k)
intervals = [[0, 4 * KK, True], [-KK, KK], [0, 2 * KK]]
def fct(s1, s2, s3, k=k):
return np.array(
(
sn(s1, k) * dc(s2, k) * ns(s3, k),
cn(s1, k) * nc(s2, k) * ds(s3, k),
dn(s1, k) * sc(s2, k) * cs(s3, k),
)
)
return (fct, intervals)
[docs]def minkowski_confocal_coordinates2(k):
KK = K(k)
intervals = [[0, 4 * KK, True], [0, 4 * KK, True], [0, 2 * KK]]
def fct(s1, s2, s3, k=k):
return np.array(
(
sn(s1, k) * cd(s2, k) * ns(s3, k),
dn(s1, k) * nd(s2, k) * cs(s3, k) / k,
cn(s1, k) * sd(s2, k) * ds(s3, k),
)
)
return (fct, intervals)
[docs]def minkowski_confocal_quadrics(a=1.0, b=0.75, c=0.0):
from ddg.geometry import Pencil, Quadric
Q1 = Quadric(np.diag([a, b, -c, -1.0]))
Q2 = Quadric(np.diag([1.0, 1.0, -1.0, 0.0]))
return Pencil(Q1, Q2)
[docs]def octahedral_grid_planes(k):
"""Fuctions for 4 curves, plus domain"""
KK = K(k)
interval = [0, 4 * KK, True]
def fct1(x):
return np.array((cn(x, k), -sn(x, k), 1, dn(x, k)), dtype="float")
def fct2(x):
return np.array((cn(x, k), -sn(x, k), 1, -dn(x, k)), dtype="float")
def fct3(x):
return np.array((-cn(x, k), sn(x, k), 1, -dn(x, k)), dtype="float")
def fct4(x):
return np.array((-cn(x, k), sn(x, k), 1, dn(x, k)), dtype="float")
return (fct1, fct2, fct3, fct4, interval)
[docs]def octahedral_grid_planes2(k):
"""Fuctions for 4 curves, plus domain"""
KK = K(k)
interval = [0, 4 * KK, True]
def fct1(x):
return np.array((dn(x, k), -k * sn(x, k), 1, cn(x, k)), dtype="float")
def fct2(x):
return np.array((dn(x, k), -k * sn(x, k), 1, -cn(x, k)), dtype="float")
def fct3(x):
return np.array((-dn(x, k), k * sn(x, k), 1, -cn(x, k)), dtype="float")
def fct4(x):
return np.array((-dn(x, k), k * sn(x, k), 1, cn(x, k)), dtype="float")
return (fct1, fct2, fct3, fct4, interval)