前提
曲線をランダムな制御点で描くプログラムを作るために、ディレクトリを分けてきれいにしようとしています。
一つのファイルで実行すると動作しますので、コードに問題はないはずです。
ランダムな曲線の生成を繰り返し、それを画像として保存するプログラムを作りたいと思い
そのためにファイルを分けた方が見やすいし、構成しやすいかなと考え構築しています。
実現したいこと
bezier.pyで定義した関数の引数?をtrain.pyで呼び出せるようにしたい。
該当のソースコード
pythonコード
bezier.py
1import numpy as np 2import math 3 4class bezier_class: 5 # Bernstein多項式を計算する関数 6 def bernstein(n, t): 7 B = [] 8 for k in range(n + 1): 9 # 二項係数を計算してからBernstein多項式を計算 10 nCk = math.factorial(n) / ( 11 math.factorial(k) * math.factorial(n - k)) 12 B.append(nCk * t ** k * (1 - t) ** (n - k)) 13 # print(nCk, k, n - k) 14 return B 15 16 # ベジェ曲線を描く関数 17 def bezier_curve(Q): 18 self = len(Q) - 1 19 dt = 0.03333333 20 t = np.arange(0, 1, dt) 21 B = Q.bernstein(self, t) 22 px = 0 23 py = 0 24 for i in range(len(Q)): 25 px += np.dot(B[i], Q[i][0]) 26 py += np.dot(B[i], Q[i][1]) 27 return px, py, t 28
train.py
1 2from bezier import bezier_class 3import numpy as np 4from matplotlib import pyplot as plt 5import random 6 7def control_point(): 8 q1 = [0, 0] 9 q2 = [random.uniform(0, 1), random.uniform(0, 1)] 10 q3 = [random.uniform(0, 1), random.uniform(0, 1)] 11 q4 = [random.uniform(0, 1), random.uniform(0, 1)] 12 q5 = [random.uniform(0, 1), random.uniform(0, 1)] 13 q6 = [1., 1.] 14 Q = [q1, q2, q3, q4, q5, q6] #←ここのQが定義されてない判定?になる(暗い文字になる) 15 16 # ベジェ曲線を描く関数を実行 17 18 19px, py, t = bezier_curve(Q) #Qに赤波線 20 21#実行すると「Qが見つかりません」と出ます。。。
試したこと
以前別の質問をした際にclassのやり方を教えてもらったのでやってみましたがうまくいきませんでした。
別のファイルから呼び出すとなると、コードを書き直す必要があるのでしょうか
補足情報(FW/ツールのバージョンなど)
インデントが微妙にずれていますが、これはソースコードのままでしょうか。
q1, q2, ・・・のところに関しては移すときの、ミスと思われます。申し訳ありません
それ以外に関しては、そのままです
いまの実際のコードでは以下のいずれかではないでしょうか?
・「file1.py」→「bezeir.py」
・「from bezier import ~」→「from file1 import ~」
なお「px, py, t = bezier_curve(Q)」の行のインデントも提示のとおりであれば
たしかにQは定義されていないので、ファイルを分ける、分けないに関係なく発生します。
分かりにくくてすみません、修正します。
現物ではなく、例えて書いてしまいました。
file1.pyがbezier.pyでfile2.pyはtrain.pyです。
回答2件