2017-08-02 13 views
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] 

ような何かをやって試してみましたが、私は「配列と配列要素を設定する」エラーが発生します。

+1

インデントと入力ミスを暗黙的に修正する: 't_parameter()'関数は、 'np.array([t])'を返すので2D配列(1次元ではあるが)を返します。したがって、 'd'は2次元であり、' d [i] 'はスカラーではなく配列です。 't_parameter()'から 't'を返すだけでよいでしょう。 – Evert

+1

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

答えて

0

私がコメントするのに十分な担当者を持っていませんが、夫婦簡単なメモ:

  • が正しくコード内でインデントあなたの機能はありますか?彼らはここにインデントされて表示されていません(私にとっては少なくとも)。これはpoint1,point2t_parameterになります。
  • d:d = t_paramiter(n)を定義する行にタイプミスがあり、d = t_parameter(n)である必要があります。あなただけのランダムなラインの終点のシリーズをプロットしている

注: d*V[0]+p1[0]は、エンドポイントのx値、ないラインです。私の知識はここで終わりますが、あなたは現在、それぞれに10ポイントを持つ1つのシリーズをプロットしているのに対して、それぞれ2つのポイントの10の別々のシリーズをプロットする必要があります。

希望に役立ちます!

関連する問題