plot_surface没有出现在我的图表中

问题描述 投票:0回答:1

我想创建一个贝塞尔曲面,但曲面没有出现。奇怪的是,当我绘制控制点而不是贝塞尔点时,它起作用了。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt

n = 10 #grid size
X = np.arange(0, 1, 1/n)
Y = np.arange(0, 1, 1/n)
X, Y = np.meshgrid(X,Y)
Z = np.zeros((n,n))
#here I try to create random continuously control points to have a nice surface
Z[0] = np.random.random()
for i in range(n - 1):
    Z[i + 1] = Z[i] * (1 + 0.1 * (np.random.normal() * 2 - 1))
for i in range(n):
    for j in range(n):
        Z[i][j] += 0.05 * Z[i][j] * (np.random.normal() * 2 - 1)

d = 10 #number of divisions (one point per control point

u, v = np.linspace(0, 1, d), np.linspace(0, 1, d) #variables

binome = lambda n, k : np.math.factorial(n) / (np.math.factorial(k) * np.math.factorial(n - k))
bernstein = lambda n, k, t : binome(n, k) * t**k * (1 - t)**(n-k)

def bezier(X,Y,Z):
    xBezier = np.zeros((d, d))
    yBezier = np.zeros((d, d))
    zBezier = np.zeros((d, d))

    for i in range(n):
        for j in range(n): #calcul de la surface
            xBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * X[i, j]
            yBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * Y[i, j]
            zBezier += bernstein(n - 1, i, u) * bernstein(n - 1, j, v) * Z[i, j]

    return(xBezier, yBezier, zBezier)

xBezier, yBezier, zBezier = bezier(X, Y, Z)

fig, ax = plt.subplots(subplot_kw={"projection": "3d"})
ax.plot_surface(xBezier, yBezier, zBezier, cmap=plt.cm.Blues)
ax.scatter(X, Y, Z, edgecolors = 'face')
plt.show()

有什么想法吗?

python matplotlib surface
1个回答
-1
投票

当您运行

plot_surface
时,x应该是每个y的x轴重复,y应该是每个x的y轴重复。我用转置
yBezier
替换了
yBezier.T
。 (我还降低了最小颜色图值以显示下端的颜色)。

...
ax.plot_surface(xBezier, yBezier.T, zBezier, cmap=plt.cm.Blues, vmin=zBezier.min() * 0.8)
ax.scatter(X, Y, Z, edgecolors = 'face', color='tab:red')
...
© www.soinside.com 2019 - 2024. All rights reserved.