Pythonでポイントとバイキュービックスプラインサーフェスの間の距離を見積もるにはどうすればよいですか? SciPy、NumPy、または他のパッケージで活用できる既存のソリューションはありますか?私は、最も近いを見つけたいPythonでポイントとバイキュービックスプラインサーフェスの間の距離を素早く推定する方法はありますか?
# Fake some measured points on the surface
z_measured = z_ideal + np.random.uniform(-0.1, 0.1, z_ideal.shape)
s_measured = scipy.interpolate.interp2d(x, y, z_measured, kind='cubic')
p_x = np.random.uniform(xmin,xmax,10000)
p_y = np.random.uniform(ymin,ymax,10000)
p_z = s_measured(p_x, p_y)
:
私はこのようバイキュービック補間によって定義された表面持っている:
import numpy as np
import scipy.interpolate
# Define regular grid surface
xmin,xmax,ymin,ymax = 25, 125, -50, 50
x = np.linspace(xmin,xmax, 201)
y = np.linspace(ymin,ymax, 201)
xx, yy = np.meshgrid(x, y)
z_ideal = (xx**2 + yy**2)/400
z_ideal += z_ideal + np.random.uniform(-0.5, 0.5, z_ideal.shape)
s_ideal = scipy.interpolate.interp2d(x, y, z_ideal, kind='cubic')
をし、私はその表面の一部の測定点を持っています表面上の点s_ideal
各点はp
になります。一般的なケースでは、スプラインを大きく変化させるための複数の解法がある可能性があるので、zに沿った点の射影の近傍に1つの解のみを持つことが知られているサーフェスに限定しています。 これは計測点や表面の定義点が非常に少ないため、正確さを犠牲にしても速度を最適化したいと考えています(1E-5
)。
頭に浮かぶ方法は、勾配降下アプローチを使用し、各測定点p
のためのような何かを行うことです。
p_z = s_ideal(pt)
- は(傾きを計算し、最初のテストポイントとして使用
pt = [p_x, p_y, p_z]
pt
- における接線)ベクター
m = [ m_x, m_y ]
pt
からp
にベクターr
を計算する:r = p - pt
r
とm
の間の角度theta
がある程度90度の範囲内にある場合、pt
が最終ポイントです。- そうでない場合は、として
pt
を更新:
r_len = numpy.linalg.norm(r)
dx = r_len * m_x
dy = r_len * m_y
if theta > 90:
pt = [ p_x + dx, p_y + dy ]
else:
pt = [ p_x - dx, p_y - dy ]
私は方法は、1Dケースのための非常に高い精度で高速な結果を生む可能性が示唆thisを見つけたが、それは、単一のディメンションのためだと私が2に変換するにはあまりにも難しいかもしれません。
私はこれで問題が解決しないと思います。 'p_z'は理想的な解法ではなく、Zの表面上の点の投影です。与えられた点Pに対する表面上の最も近い点Psは、表面法線ベクトルが' P '。各テストポイントは対応する最も近いサーフェスポイントになるはずなので、クラスタリングはその目的に役立たないようです。 – Brian