塗りつぶし3D表示サンプル

matplotlib の plot_surface() の初歩的使い方を勉強しました。
サンプルはピラミッドですが、左図はその「底辺」の線が明示されず、不思議な絵になっています。
右図は各「塗りつぶし面」が平面になるように、ピラミッドの敷地の四隅を掘り下げた (z = -1) 場合です。
以下、サンプルイメージとソースコードをご参照ください。実行すると絵がマウスでグリグリ動きます。

# ピラミッドみたいな形状を表面塗りつぶしで3D表示
# 2023.01.24 by Kero
#
# plot_surface() の原理は、碁盤の目を作り、
# 各目の中に図形の稜の座標を入れる。m行n列の目の座標を、
# m-1行n列、m行n-1列、m行n+1列、m+1行n列の
# 4つの目の座標と線で結び、出来た4つの平面図形をそれぞれ塗りつぶす、
# その繰り返しのようです。plot_surface() の引数は、
# x,y,z の値ごとに、行で集めて配列にし、それらの行を縦に集めて配列と
# したものです。
# プログラムを実行したら、マウスでグリグリ動かせます。
# plot_surface() の替わりに plot_wireframe() では稜線が表示されます。

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


fig = plt.figure()
ax1 = fig.add_subplot(121, projection='3d')
ax2 = fig.add_subplot(122, projection='3d')

xs = np.array([
    [0, 1, 2],
    [0, 1, 2],
    [0, 1, 2]
])
ys = np.array([
    [0, 0, 0],
    [1, 1, 1],
    [2, 2, 2]
])
z1 = np.array([
    [0, 0, 0],
    [0, 1, 0],
    [0, 0, 0]
])


z2 = np.array([
    [-1, 0, -1],
    [ 0, 1,  0],
    [-1, 0, -1]
])

ax1.plot_surface(xs, ys, z1)
ax2.plot_surface(xs, ys, z2)

plt.show()

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です