1

Pythonで回転できる立方体を作成しましたが、回転したときに各面を識別するために面に色を付けたいと思います。以下のコード:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from itertools import product, combinations
from numpy import sin, cos

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("auto")
ax.set_autoscale_on(True)


#dibujar cubo
r = [-10, 10]
for s, e in combinations(np.array(list(product(r,r,r))), 2):
    if np.sum(np.abs(s-e)) == r[1]-r[0]:
        ax.plot3D(*zip(s,e), color="b")


#dibujar punto
#ax.scatter([0],[0],[0],color="g",s=100)

d = [-2, 2]
theta = np.radians(45)
for s, e in combinations(np.array(list(product(d,d,d))), 2):
    if np.sum(np.abs(s-e)) == d[1]-d[0]:
        s_rotated = [s[0]*cos(theta)-s[1]*sin(theta),
                     s[0]*sin(theta)+s[1]*cos(theta),
                     s[2]]
        e_rotated = [e[0]*cos(theta)-e[1]*sin(theta),
                     e[0]*sin(theta)+e[1]*cos(theta),
                     e[2]]
        ax.plot3D(*zip(s_rotated,e_rotated), color="g")
plt.show()

そこで、中に入っている立方体を塗りたいと思います。何か助けはありますか?ありがとうございました!

4

2 に答える 2

0

あなたが探している効果は、次の理由で達成するのが難しいでしょう:

  • matplotlib立方体であることを認識していないため、平面内の点を計算して色を付ける必要があります。

  • Matplotlib 3D プロットは、3D データを 2D に投影したものです。これは、線と平面の交点をプロットする場合に特に顕著です: ここに画像の説明を入力 線が平面より下にある場合、そのようには見えません。次のように設定することでこれを回避できますalpha線の下にあるとき、線の透明度が低くなります。これが意味することは、インタラクティブに変更できるビューアーに対してどの平面が「正面を向いているか」の回転に基づいて計算する必要があるということです!

  • 使用できる2Dの場合、matplotlib 3dで何かをペイントする方法はありplt.fill_betweenませんが、この機能は3Dには拡張されません。

最初の 2 つの問題は、理論的には立方体の数学を書き出すことで解決できますが、平面と視聴者に対する可視性を定義することで解決できますが、最後の問題はどのように解決するのか本当にわかりません。基本的に、fill between を記述する必要があります。これは、3D でシェーディングされたポリゴンで領域を塗りつぶす関数です。

この憂鬱な見通しでは、いくつかの代替案を提案できます。頂点が同じエッジ上にあるかどうかを既に確認しているので、各面に斜めの十字を追加するだけです。

または、この種のことを行うように設計されたグラフィカル プロット ツールに移動します。ラテックスの経験がある場合は、tikz 3D プロットを試してみてください。コードと非常にきれいな出力が組み合わされていますが、それは少しおかしな話です。

編集:crossesキューブに入れる方法は次のとおりです。

for ループ内のステートメントは、点とifの間の距離をチェックします。これが行われる方法により、実際の違いはチェックされませんが、2 つを分離するベクトルの長さの数は、との長さを返す印刷によってチェックできます。したがって、2 つのベクトルで区切られたものが必要です。つまり、別のステートメントに追加します。senp.sum(np.abs(s-e))4812if

elif np.sum(np.abs(s-e))== 2 * (d[1]-d[0]):
    s_rotated = [s[0]*cos(theta)-s[1]*sin(theta),
                 s[0]*sin(theta)+s[1]*cos(theta),
                 s[2]]
    e_rotated = [e[0]*cos(theta)-e[1]*sin(theta),
                 e[0]*sin(theta)+e[1]*cos(theta),
                 e[2]]
    ax.plot3D(*zip(s_rotated,e_rotated), color="r")

2 つのベクトル長で区切られたすべての点を赤で描画します ここに画像の説明を入力

各クロスを異なる色でプロットしたいのは明らかですが、これは現在の形式のコードでは不可能です。これは、ポイント間の長さのみをチェックするためです。ポイントの異なるセットを区別する方法が必要です。

これを行う最善の方法がわからないので、ここで終了します。私の意見では、ポイントのすべての組み合わせを実行するのをやめて、実際にポイントに適切にラベルを付ける必要があります。

于 2013-09-18T20:25:23.110 に答える