當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python SciPy spatial.geometric_slerp用法及代碼示例

本文簡要介紹 python 語言中 scipy.spatial.geometric_slerp 的用法。

用法:

scipy.spatial.geometric_slerp(start, end, t, tol=1e-07)#

幾何球麵線性插值。

插值沿任意維度空間中的unit-radius 大圓弧進行。

參數

start (n_dimensions, ) 類似數組

一維數組對象中的單個 n 維輸入坐標。 n 必須大於 1。

end (n_dimensions, ) 類似數組

一維數組對象中的單個 n 維輸入坐標。 n 必須大於 1。

t float 或 (n_points,) 類似一維數組

表示插值參數的浮點或一維雙精度數組,其值需要在 0 和 1 之間的包含區間內。常見的方法是使用 np.linspace(0, 1, n_pts) 為線性間隔點生成數組。允許升序、降序和亂序。

tol 浮點數

確定開始和結束坐標是否為對映點的絕對容差。

返回

result (t.size, D)

包含插值球麵路徑的雙精度數組,包括使用 0 和 1 t 時的開始和結束。插值應對應於 t 數組中提供的相同排序順序。如果t 是浮點數,則結果可能是一維的。

拋出

ValueError

如果startend是對映體,不在單元n-sphere上,或者針對各種退化情況。

注意

該實現基於 [1] 中提供的數學公式,並且該算法的第一個已知介紹源自對 4-D 幾何的研究,在 Ken Shoemake 的原始四元數 Slerp 出版物的腳注中歸功於 Glenn Davis [ 2]。

參考

[2]

Ken Shoemake (1985) 使用四元數曲線動畫旋轉。 ACM SIGGRAPH 計算機圖形學,19(3):245-254。

例子

在跨越 90 度的圓的圓周上插入四個 linearly-spaced 值:

>>> import numpy as np
>>> from scipy.spatial import geometric_slerp
>>> import matplotlib.pyplot as plt
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> start = np.array([1, 0])
>>> end = np.array([0, 1])
>>> t_vals = np.linspace(0, 1, 4)
>>> result = geometric_slerp(start,
...                          end,
...                          t_vals)

插值結果應在單位圓上可識別的 30 度間隔:

>>> ax.scatter(result[...,0], result[...,1], c='k')
>>> circle = plt.Circle((0, 0), 1, color='grey')
>>> ax.add_artist(circle)
>>> ax.set_aspect('equal')
>>> plt.show()
scipy-spatial-geometric_slerp-1_00_00.png

嘗試在圓上的對映點之間進行插值是不明確的,因為有兩條可能的路徑,而在球體上,測地線表麵上有無限可能的路徑。盡管如此,其中一條模棱兩可的路徑與警告一起返回:

>>> opposite_pole = np.array([-1, 0])
>>> with np.testing.suppress_warnings() as sup:
...     sup.filter(UserWarning)
...     geometric_slerp(start,
...                     opposite_pole,
...                     t_vals)
array([[ 1.00000000e+00,  0.00000000e+00],
       [ 5.00000000e-01,  8.66025404e-01],
       [-5.00000000e-01,  8.66025404e-01],
       [-1.00000000e+00,  1.22464680e-16]])

將原始示例擴展到球體並繪製 3D 插值點:

>>> from mpl_toolkits.mplot3d import proj3d
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111, projection='3d')

繪製單位球以供參考(可選):

>>> u = np.linspace(0, 2 * np.pi, 100)
>>> v = np.linspace(0, np.pi, 100)
>>> x = np.outer(np.cos(u), np.sin(v))
>>> y = np.outer(np.sin(u), np.sin(v))
>>> z = np.outer(np.ones(np.size(u)), np.cos(v))
>>> ax.plot_surface(x, y, z, color='y', alpha=0.1)

對大量點進行插值可能會在球體表麵上提供平滑曲線的外觀,這對於球體表麵上的離散積分計算也很有用:

>>> start = np.array([1, 0, 0])
>>> end = np.array([0, 0, 1])
>>> t_vals = np.linspace(0, 1, 200)
>>> result = geometric_slerp(start,
...                          end,
...                          t_vals)
>>> ax.plot(result[...,0],
...         result[...,1],
...         result[...,2],
...         c='k')
>>> plt.show()
scipy-spatial-geometric_slerp-1_01_00.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.spatial.geometric_slerp。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。