2012-09-05 200 views
2

所以我正在學習python,我目前正在製作3D圖。爲了讓事情有趣,我想製作一個Klein Bottle的陰謀,但不知何故,它根本不起作用。我嘗試了兩種表面參數(一種在Wolfram上,另一種在隨機網站上)都給出了圓環圖。Python:一個Klein瓶的3D陰謀

所以我想知道如果也許我的代碼是錯誤的。任何人可以看看,並告訴我,如果我這樣做是正確的(如果你碰巧知道一個克萊因瓶的參數化,那麼這是值得歡迎的太多:P)

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 

def surf(u, v): 
    X = (3+(1+np.sin(v)) + 2*(1 - np.cos(v)/2)*np.cos(u))*np.cos(v) 
    Y = (4+2*(1 - np.cos(v)/2) * np.cos(u))*np.sin(v) 
    Z = -2*(1-np.cos(v)/2)*np.sin(u) 
    return X,Y,Z 
ux, vx = np.meshgrid(np.linspace(0, 2*np.pi, 20), 
         np.linspace(0, 2*np.pi, 20)) 
x,y,z = surf(ux, vx) 

fig = plt.figure() 
ax = fig.gca(projection="3d") 

plot = ax.plot_surface(x,y,z, rstride=1, cstride=1, cmap=cm.jet, 
         linewidth=0, antialiased=False) 

plt.show() 
+0

什麼是不工作?我只是運行你的代碼,並得到一個圓環面的圖。你的問題是關於糟糕的Python代碼,還是把錯誤的數學放入良好的Python代碼中? – tpg2114

+0

也看着圓環我也是;你可以改變視角(例如'ax.view_init(75,-30)')來說服你自己中間有一個洞。 – DSM

+0

好吧,我不確定它的數學或代碼,如果你們可以確認我得到的代碼是正確的,那麼至少我可以專注於其他事情:P – Coolcrab

回答

6

Python代碼具有正確的形式,但看起來參數化可能存在一些錯誤。這裏是克萊因瓶生產由a different parametrization

import mpl_toolkits.mplot3d.axes3d as axes3d 
import matplotlib.pyplot as plt 
import numpy as np 

cos = np.cos 
sin = np.sin 
sqrt = np.sqrt 
pi = np.pi 

def surf(u, v): 
    """ 
    http://paulbourke.net/geometry/klein/ 
    """ 
    half = (0 <= u) & (u < pi) 
    r = 4*(1 - cos(u)/2) 
    x = 6*cos(u)*(1 + sin(u)) + r*cos(v + pi) 
    x[half] = (
     (6*cos(u)*(1 + sin(u)) + r*cos(u)*cos(v))[half]) 
    y = 16 * sin(u) 
    y[half] = (16*sin(u) + r*sin(u)*cos(v))[half] 
    z = r * sin(v) 
    return x, y, z 

u, v = np.linspace(0, 2*pi, 40), np.linspace(0, 2*pi, 40) 
ux, vx = np.meshgrid(u,v) 
x, y, z = surf(ux, vx) 

fig = plt.figure() 
ax = fig.gca(projection = '3d') 
plot = ax.plot_surface(x, y, z, rstride = 1, cstride = 1, cmap = plt.get_cmap('jet'), 
         linewidth = 0, antialiased = False) 

plt.show() 

enter image description here

+0

很棒!但是,你能解釋一下'x [:,:u.shape [1] // 2]'嗎?我知道它抓住了數組的第一部分,但我怎樣才能抓住第二部分呢? (swiching:的周圍不起作用) – Coolcrab

+0

要抓住下半場,你可以使用'x [:,u.shape [1] // 2:]'。不過,我已經清理了一下代碼,所以你不必使用'u.shape [1] // 2'。 – unutbu