Она берет точку на поверхности единичного октаэдра (p: такую, что | u|+|v|+|w| = 1) и возвращает точку на поверхности единичной сферы. Функция не идеальна, но цель состоит в том, чтобы сохранить подлинное расстояние между точками.
Я думал об использовании SciPy свертывания для обеспечения числового обратного значения, но не могу уложиться в этом. .
ввод: сферические точки [x,y,z],
выход октаэдрические точки [u,v,w] такие, что ak([u,v,w])=[x,y,z]
Моя функция ak() определяется следующим образом:
Код: Выделить всё
def ak(p):
# Convert point on octahedron onto the sphere.
# Credit to Anders Kaseorg: https://math.stackexchange.com/questions/5016695/
# input: oct_pt is a Euclidean point on the surface of a unit octagon.
# output: UVW on a unit sphere.
a = 3.227806237143884260376580641604959964752197265625 # 𝛂 - vis. Kaseorg.
p1 = (np.pi * p) / 2.0
tp1 = np.tan(p1)
xu, xv, xw = tp1[0], tp1[1], tp1[2]
u2, v2, w2 = xu ** 2, xv ** 2, xw ** 2
y0p = xu * (v2 + w2 + a * w2 * v2) ** 0.25
y1p = xv * (u2 + w2 + a * u2 * w2) ** 0.25
y2p = xw * (u2 + v2 + a * u2 * v2) ** 0.25
pv = np.array([y0p, y1p, y2p])
return pv / np.linalg.norm(pv, keepdims=True)
Есть подсказки?
Подробнее здесь: https://stackoverflow.com/questions/793 ... e-function