2012-06-20 7 views
3

파라 메트릭 (u-v) 서페이스를 처리하기위한 Python 모듈이 있습니까?Python의 파라 메트릭 서페이스 만들기

xypts = [[0., 1., 5., 2.], [4., 3., 6., 7.]] 
tck, u = scipy.interpolate.splprep(xypts, s=0, k=3) 

를 다음에 어떤 t 값에 점을 얻을 : 나는 2 차원의 집합을 통해 파라 메트릭 스플라인을 만들 수있는 곳의 스플라인 기능을 scipy.interpolate하는 3 차원 아날로그 뭔가를 찾고 있어요 thusly 히 지적 다음과 같이 스플라인 :

t = 0.5 
intxypt = scipy.interpolate.splev(t, tck) 

그래서, 내가 원하는 것은 다음과 같이 작동 뭔가 :

# xyzpts is a 3 x m x n matrix, with m and n >= 4 for a cubic surface 
tck, s, t = srfprep(xyzpts, s=0, k=3) 
u, v = 0.5, 0.5 
intxyzpt = srfev(u, v, tck) 

난 그냥이 몇 시간 전에 할 내 자신의 코드를 작성하지만, 솔직히 좀 짜증 (slo w와 연약한, 특히 표면 모서리에서) 그리고 나는 더 표준적이고 최적화 된 것을 찾고 있습니다.

답변

1

이것은 아마도 분명하지만 자외선을 추측 할 수있는 경우, 각각의 데이터 포인트 (표면 그래프 경우 간단한 경우 u=x, v=y), 파라 보간 (u,v) -> (x,y,z)에 대응하는 좌표를 본질적으로 개별 (3)의 2-D 보간 인 데이터 세트 (x, y 및 z 좌표)이므로 일반적인 2-D 보간 방법을 사용할 수 있습니다.

splprep 실제로 점들이 정렬되고 유클리드 거리를 사용하여 u[i] = u[i-1] + dist(p[i], p[j])에 따라 u 좌표를 지정함으로써이 방법으로 작동합니다. 이 점은 어떤 점이 서로 나란히 있는지를 안다면 2D로 일반화됩니다. x,y,z 데이터를 2 차원 배열로 온다면 예를 들어,

from scipy import interpolate 
import numpy as np 

# example dataset (wavy cylinder) 

def surf(u, v): 
    x = np.cos(v*np.pi*2) * (1 + 0.3*np.cos(30*u)) 
    y = np.sin(v*np.pi*2) * (1 + 0.3*np.cos(30*u)) 
    z = 2*u 
    return x, y, z 

ux, vx = np.meshgrid(np.linspace(0, 1, 20), 
        np.linspace(0, 1, 20)) 
x, y, z = surf(ux, vx) 

# reconstruct (u, v) using the existing (!) neighbourhood information 
du = np.sqrt(np.diff(x, axis=0)**2 + np.diff(y, axis=0)**2 + np.diff(z, axis=0)**2) 
dv = np.sqrt(np.diff(x, axis=1)**2 + np.diff(y, axis=1)**2 + np.diff(z, axis=1)**2) 
u = np.zeros_like(x) 
v = np.zeros_like(x) 
u[1:,:] = np.cumsum(du, axis=0) 
v[:,1:] = np.cumsum(dv, axis=1) 

u /= u.max(axis=0)[None,:] # hmm..., or maybe skip this scaling step -- may distort the result 
v /= v.max(axis=1)[:,None] 

# construct interpolant (unstructured grid) 
ip_surf = interpolate.CloughTocher2DInterpolator(
     (u.ravel(), v.ravel()), 
     np.c_[x.ravel(), y.ravel(), z.ravel()]) 

# the BivariateSpline classes might also work here, but the above is more robust 

# plot projections 
import matplotlib.pyplot as plt 

u = np.random.rand(2000) 
v = np.random.rand(2000) 

plt.subplot(131) 
plt.plot(ip_surf(u, v)[:,0], ip_surf(u, v)[:,1], '.') 
plt.title('xy') 
plt.subplot(132) 
plt.plot(ip_surf(u, v)[:,1], ip_surf(u, v)[:,2], '.') 
plt.title('yz') 
plt.subplot(133) 
plt.plot(ip_surf(u, v)[:,2], ip_surf(u, v)[:,0], '.') 
plt.title('zx') 
plt.show() 

편집을 수행 할 수 있습니다 좋아, 나는이 거기 것 같다으로 위, 실제로 u,v을 계산하는 방법 강력한 완전히 확실하지 않다 왜곡의 여지가있다. 그러나 아래의 LocallyLinearEmbedding은이 점에서 더 잘 작동합니다.

는 예를 들어 방금 포인트 무리없이 이웃 정보를 가지고는 u,v 값을 추측하기 하지 수있는 경우, 문제는 더욱 어려워진다. 여기에 적절한 키워드는 "표면 재건"과 "다각적 인 학습"인 것 같습니다.

나는 시도하지 않았지만, 당신이 쉽게 u,v 좌표를 사용하여 을 사용하여 좌표계를 익혔습니다. see this example. 그들은 여러 알고리즘을 가지고 있으며, 이것은 충분히 견고합니다. 그 결과로 u = Y[:,0]; v = Y[:,1] 위의 그림과 같이 구조화되지 않은 2 차원 보간 방법을 사용할 수 있습니다.

더 많은 검색 결과가 더 많이 나올 수도 있습니다.

+0

아니요. * 분명하지 않습니다. 당신은 저에게 제가 더 나은 것을 다시 구현할 필요가있는 통찰력을주었습니다. 감사합니다. 기록을 위해, 이것들은 같은 수의 점을 가진 단면 커브로부터 내가 만들고있는 에어 포일 표면입니다. 나는 이미 그 커브로부터 'u'값을 가지고 있습니다; 'v'값은 단순히 상대적 단면 높이입니다. – subnivean

관련 문제