0
パラメトリック方程式を使用して線分をランダムに生成するプログラムを作成しようとしています。私が作ったのは仕事の種類ですが、線が互いに切り離されているのではなく、一つの線が連続しています。これは私がPythonで書いたものです。パラメトリック方程式を使用するランダム線分
enter import numpy as np
import random as rand
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_aspect("equal")
npoints = 10
V = np.zeros(npoints)
def point1 (npoints):
x0 = np.zeros(npoints)
y0 = np.zeros(npoints)
z0 = np.zeros(npoints)
for k in range (npoints):
theta = rand.uniform(0.0, np.pi)
phi = rand.uniform(0.0, (2 * np.pi))
x0[k] = 10 * np.sin(phi) * np.cos(theta)
y0[k] = 10 * np.sin(phi) * np.sin(theta)
z0[k] = 10 * np.cos(theta)
return np.array([x0,y0,z0])
def point2 (npoints):
x1 = np.zeros(npoints)
y1 = np.zeros(npoints)
z1 = np.zeros(npoints)
for j in range (npoints):
theta = rand.uniform(0.0, np.pi)
phi = rand.uniform(0.0, (2 * np.pi))
x1[j] = 10 * np.sin(phi) * np.cos(theta)
y1[j] = 10 * np.sin(phi) * np.sin(theta)
z1[j] = 10 * np.cos(theta)
return np.array([x1,y1,z1])
n = 10
def t_parameter(n):
t = np.zeros(n)
for i in range (n):
t[i] = rand.uniform(-10,10)
return np.array([t])
p1 = point1(npoints)
p2 = point2(npoints)
V = p2-p1
d = t_paramiter(n)
Lx = d*V[0]+p1[0]
Ly = d*V[1]+p1[1]
Lz = d*V[2]+p1[2]
ax.plot_wireframe(Lx,Ly,Lz)
コードを実行すると、これは生成されるものですplot of what is generatedです。私がしたいことは、ランダムな値でdを更新するだけで、初期点と方向ベクトルの値を一定に保つことです。
私はこの
Lx = np.zeros(npoints)
Ly = np.zeros(npoints)
Lz = np.zeros(npoints)
for i in range (n):
Lx[i] = d[i]*V[i]+p1[i]
Ly[i] = d[i]*V[i]+p1[i]
Lz[i] = d[i]*V[i]+p1[i]
ような何かをやって試してみましたが、私は「配列と配列要素を設定する」エラーが発生します。
インデントと入力ミスを暗黙的に修正する: 't_parameter()'関数は、 'np.array([t])'を返すので2D配列(1次元ではあるが)を返します。したがって、 'd'は2次元であり、' d [i] 'はスカラーではなく配列です。 't_parameter()'から 't'を返すだけでよいでしょう。 – Evert
NumPyには[ベクトル化一様ランダムルーチン](https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.random.uniform.html#numpy.random.uniform)があります。単純に 'd = np.random.uniform(-10、10、n)'を実行し、 't_parameter()'関数全体を削除することができます。 – Evert