2014-03-24 39 views
0

我想知道是否可以在不移動/翻譯它的情況下縮放mayavi中的表面對象。Mayavi-在沒有平移的情況下對錶面進行縮放

到目前爲止,我只是使用surface.actor.actor.scale屬性併爲其分配3D矢量。然而,表面不保留其原始位置,但縮放是相對於原點(0,0,0)進行的 - 這就是爲什麼它看起來像表面移動...

任何想法?

+0

您是否嘗試將演員的起源設置爲曲面質心? – aestrivex

+0

嗯,我想我可以做到這一點..但爲此,我首先必須計算質量中心。 –

+0

那麼,如果你不想這樣做,那麼你期待什麼樣的結果?表面*將會移動,因爲較大尺寸的表面不可能佔用與較小表面相同的點。因此,表面會「移動」。你的問題是有意義的,因爲表面可以在沒有平移的情況下進行縮放。這不是你想要的嗎?原則上質心的選擇取決於可視化。但對於大多數目的,我會選擇表面的X,Y,Z範圍的中點,這很容易計算。 – aestrivex

回答

1

當我問到vtk演員的origin屬性時,我真的在詢問已經嘗試過的東西。我已經玩了一些,但我不知道vtk演員如何決定自己的所有細節,這是非常複雜和骯髒的,我發現它更容易,只是破解它並手動進行數學運算(至少當數學很簡單時)。

這是一個更簡單的解決方案。請注意,它不一定是最好的解決方案。我可能還沒有找到更清潔的解決方案。

該解決方案的基本思想非常簡單:刮除表面頂點的x,y,z座標,將正確的線性轉換應用到這些點,並將它們反饋回源。

surf = mlab.surf(*args) # somehow generate a surface 
xc,yc,zc = centroid() #somehow determine the x,y,z coordinates to stabilize towards 
scale_factor = 2.8 

tx,ty,tz = surf.mlab_source.x, surf.mlab_source.y, surf.mlab_source.z 
aff = np.eye(4)*scale_factor 
aff[:,3] = (-xc,-yc,-zc,1) 

dat = np.array(zip(tx,ty,tz,np.ones(len(tx)))) 
surf.mlab_source.x, surf.mlab_source.y, surf.mlab_source.z,_ = np.dot(aff, dat.T) 
相關問題