2016-03-06 144 views
1

有沒有任何方法繪製像橢球體一樣的曲面3D?如何繪製橢圓體與陰謀

目前在文檔中僅討論了形式爲z = f(x,y)的表面。還有Mesh 3D,但我沒有找到它的例子。似乎可以手動對橢球進行三角測量,然後使用網格來獲得橢球,但對我來說看起來有點困難。有沒有更好的方法來做到這一點?

回答

3

好吧,它比我想象的要容易。有個alphahull選項自動計算出相應的三角測量值。

from plotly.offline import iplot, init_notebook_mode 
from plotly.graph_objs import Mesh3d 
from numpy import sin, cos, pi 

# some math: generate points on the surface of ellipsoid 

phi = np.linspace(0, 2*pi) 
theta = np.linspace(-pi/2, pi/2) 
phi, theta=np.meshgrid(phi, theta) 

x = cos(theta) * sin(phi) * 3 
y = cos(theta) * cos(phi) * 2 
z = sin(theta) 

# to use with Jupyter notebook 

init_notebook_mode() 

iplot([Mesh3d({ 
       'x': x.flatten(), 
       'y': y.flatten(), 
       'z': z.flatten(), 
       'alphahull': 0 
})]) 

Ellipsoid

這爲R版本:

library(pracma) 
theta <- seq(-pi/2, pi/2, by=0.1) 
phi <- seq(0, 2*pi, by=0.1) 
mgrd <- meshgrid(phi, theta) 
phi <- mgrd$X 
theta <- mgrd$Y 
x <- cos(theta) * cos(phi) * 3 
dim(x) <- NULL 
y <- cos(theta) * sin(phi) * 2 
dim(y) <- NULL 
z <- sin(theta) * scale 
dim(z) <- NULL 

ell <- cbind(x, y, z) 

ell <- setNames(ell, c('x', 'y', 'z')) 

library(plotly) 
p <- plot_ly(as.data.frame(ell), x=x, y=y, z=z, type='mesh3d', alphahull = 0) 

p %>% layout(scene = list(aspectmode = 'data')) 

編輯:還可以使用type='surface'產生參數化繪圖:在這種情況下,一個都提供兩個維xy

library(plotly) 
library(pracma) 
mgrd <- meshgrid(seq(-pi, pi, length.out = 100), seq(-pi/2, pi/2, length.out = 100)) 
U <- mgrd$X 
V <- mgrd$Y 
frame <- list(x=cos(V)*cos(U)*3, y=cos(V)*sin(U)*2, z=sin(V)) 
plot_ly(frame, type='surface', x=x, y=y, z=z, showlegend=F, showscale=F, 
     colorscale=list(list(0, 'blue'), list(1, 'blue'))) 
+1

哇。我回來的時候期待這個比我的更有效率,但是發現有人低估了沒有解釋。 –

+0

@ 42-,這是因爲你的答案有一張照片,我的照片沒有。 :) –

+1

你的形象現在好多了。你的代碼看起來處於「更高」的抽象層次。我很高興你保持幽默感。 –

2

爲什麼不解決針對z在這個等式從數學項目抓起橢球:

enter image description here

require(plotly) 
a=5; b=7; c=9 
x=rep(seq(-10,10,by=1), each=21) 
y=rep(seq(-10,10,by=1), times=21) 
z <- c^2*sqrt(1-x^2/a^2-y^2/b^2) 
#Warning message: 
#In sqrt(1 - x^2/a^2 - y^2/b^2) : NaNs produced 

plot_ly(z = matrix(z,21,21), type = "surface") 

enter image description here

+0

是的,我想過了,但我不需要一半的橢球體,而是整個橢球體。我不確定,如果有可能用sufrace plot創建兩個半橢球體(可能是),但恐怕它不會像Mesh 3d橢球體那麼好(表面幾乎垂直的表面情節可能會奇怪切面)。 –

+0

你的答案顯然更好。你應該給自己勾選標記。我想知道是否有一種方法可以在R界面中嵌入Mesh3d調用,但這超出了我目前的功能。 –

+0

最後,我找到了一個答案,它是你和我的線性組合:使用'type =「surface」',但爲它提供二維'x'和'y'並以這種方式得到參數圖。 (請參閱我的答案更新。) –