2

だから私はpythonを学んでいて、現在、物事の3Dプロットを作成しています。物事を面白く保つために、クラインボトルのプロットを作成したいのですが、どういうわけかまったく機能していません. そして、サーフェスの 2 つのパラメーター化を試みました (1 つはWolframで、もう 1 つはランダムな Web サイトで) 両方とも、トーラスのような図が得られました。

だから、私のコードが間違っているのではないかと思っていました。誰か見て、私がそれを正しく行っているかどうか教えてもらえますか (もしあなたがたまたまクラインの瓶のパラメータ化を知っているなら、それも大歓迎です :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()
4

1 に答える 1

6

Python コードの形式は正しいですが、パラメータ化にエラーがあるようです。以下は、別のパラメーター化によって作成されたクラインの壷です。

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()

ここに画像の説明を入力

于 2012-09-05T19:41:09.120 に答える