点群単純化アルゴリズムの作業で忙しいです。
以下は、ポイントの近傍に対する法線を計算するコードです。主成分分析を使いました。
ポイントの法線と曲率を正しく計算したかどうかを知りたいですか?
法線が方向付けられていないことは承知しており、次のステップは、ネットワーク x (各ポイントからその最も近い隣接ポイントへのエッジ) を使用してグラフを作成し、各エッジを 1-|ni*ni+1| で重み付けすることです。. 次に、最小スパニング ツリーを作成し、最大 z 値ポイントから開始して深さ検索を開始し、 ni*ni+1=-1 の場合は ni+1 の向きを反転します。グローバルで一貫した向きを実現できるように、 networkx を使用します。これが最善の方法ですか?
ありがとう
import numpy as np
#NEIGHBOURING POINTS
XYZ = np.array([[-0.0369122 , 0.12751199 , 0.00276757],
[-0.0398624 , 0.128204 , 0.00299348],
[-0.0328896 , 0.12613 , 0.00300653],
[-0.0396095 , 0.12667701 ,-0.00334699],
[-0.0331765, 0.12681 , 0.00839958],
[-0.0400911 ,0.128618 , 0.00909496],
[-0.0328901 , 0.124518 , -0.00282055]])
#GET THE COVARIANCE MATRIX
average=sum(XYZ)/XYZ.shape[0]
b = np.transpose(XYZ - average)
cov=np.cov(b)
#GET EIGEN VALUES AND EIGEN VEECTORS
e_val,e_vect = np.linalg.eigh(cov)
print e_val
print 'eigenvectors'
print e_vect
#DIAGONLIZE EIGENVALUES
print 'eigenvalues'
e_val_d = np.diag(e_val)
print e_val_d
#FIND MIN EIGEN VALUE
h = np.rank(min(e_val))
#FIND NORMAL
norm = e_vect[:,h]
print 'normal'
print norm
#CALCULATE CURVATURE
curvature = e_val[0]/(e_val[0]+e_val[1]+e_val[2])
print 'curvature'
print curvature