実現したいこと
Python3で、OpenCVを用いてフラクタル ツリーを描画したいと考えています。
発生している問題・エラーメッセージ
現在、黒い背景画像のみが描画されている状態です。
Main関数の実行回数を定めるために
for number in range(1, 10): Main(number)
というfor文を書いたのですが、動作していないように思われます。
どのようにしたらよろしいでしょうか。
該当のソースコード
import numpy as np import cv2 #黒背景 img = np.zeros((600,600,3), np.uint8) Tree = [] PreTree = [] l = len(Tree) def Main(number): if number == 1: PreEndX = 300 PreEndY = 0 PreRadius = 100 PreTheta = 0 R = Branch(PreEndX, PreEndX, PreRadius, PreTheta, 1) #右方向へのびる枝 r = Branch(PreEndX, PreEndX, PreRadius, PreTheta, -1) #左 Tree.append(R) Tree.append(r) else: for i in range(1, Delta1 + 1): #増えた配列の長さの分、for文を実行 PreEndX= PreTree[Prel+i-1:Prel+i][0][3] PreEndY= PreTree[Prel+i-1:Prel+i][0][4] PreRadious=PreTree[Prel+i-1:Prel+i][0][5] PreTheta= PreTree[Prel+i-1:Prel+i][0][6] R = Branch(PreEndX, PreEndY, PreRadius, PreTheta, 1) r = Branch(PreEndX, PreEndY, PreRadius, PreTheta, -1) Tree.append(R) Tree.append(r) Prel=l Deltal=l-Prel #増えた配列の長さをDeltalとおく。 for i in range(1,l+1): cv2.line(img, (int(Tree[i-1:i][0][0]), int(Tree[i-1:i][0][1])), (int(Tree[i-1:i][0][2]), int(Tree[i-1:i][0][3])),(255,255,255),2) cv2.imshow('forest of objects', img) cv2.waitKey(0) cv2.imshowAllWindows() PreTree=Tree #現在のTreeをPreTreeに格納しておく。 #---------------------------------------このfor文が実行されていない for number in range(1, 10): Main(number) print(number, "回実行されました。") #次のEND座標を計算するBranch関数を定義 def Branch(ThisEndX, ThisEndY, ThisRadius, ThisTheta, ThisDirection): ThisBeginX=ThisEndX ThisBeginY=ThisEndY ThisRadious = ThisRadius * 0.67 ThisTheta = ThisTheta + 30 if ThisTheta >= 360: ThisTheta = ThisTheta-360 if ThisTheta <= -360: ThisTheta = ThisTheta + 360 ThisThetaRad = np.radians(ThisTheta) ThisEndX = ThisEndX + np.sin(ThisThetaRad) * ThisRadius * ThisDirection ThisEndY = ThisEndY + np.cos(ThisThetaRad) * ThisRadius return (ThisBeginX, ThisBeginY, ThisEndX, ThisEndY, ThisRadius, ThisTheta)
Errorはでていないのでしょうか。
画面上でEnterでも押してみては。
ご返信いただきましてありがとうございます。cv2.waitKey(0)を記述した事を失念しておりました。
Enterを押したところ、
NameError: name 'Branch' is not defined とエラーが出たため、以下のようにコードを書き換えたところ、エラーは出なくなりました。
```
import numpy as np
import cv2
#黒背景
img = np.zeros((600,600,3), np.uint8)
Tree = []
PreTree = []
l = len(Tree)
def Main(number):
Prel=l
Deltal=l-Prel #増えた配列の長さをDeltalとおく。
print(l) ### 0が9回出力される
if number == 1:
PreEndX = 300
PreEndY = 0
PreRadius = 100
PreTheta = 0
R = Branch(PreEndX, PreEndX, PreRadius, PreTheta, 1) #右方向へのびる枝
r = Branch(PreEndX, PreEndX, PreRadius, PreTheta, -1) #左
Tree.append(R)
Tree.append(r)
else:
for i in range(1, Deltal + 1): #増えた配列の長さの分、for文を実行
PreEndX= PreTree[Prel+i-1:Prel+i][0][3]
PreEndY= PreTree[Prel+i-1:Prel+i][0][4]
PreRadious=PreTree[Prel+i-1:Prel+i][0][5]
PreTheta= PreTree[Prel+i-1:Prel+i][0][6]
R = Branch(PreEndX, PreEndY, PreRadius, PreTheta, 1)
r = Branch(PreEndX, PreEndY, PreRadius, PreTheta, -1)
Tree.append(R)
Tree.append(r)
for i in range(1,l+1):
#print(l)
cv2.line(img, (int(Tree[i-1:i][0][0]), int(Tree[i-1:i][0][1])), (int(Tree[i-1:i][0][2]), int(Tree[i-1:i][0][3])),(255,255,255),2)
PreTree=Tree #現在のTreeをPreTreeに格納しておく。
#次のEND座標を計算するBranch関数を定義
def Branch(ThisEndX, ThisEndY, ThisRadius, ThisTheta, ThisDirection):
ThisBeginX=ThisEndX
ThisBeginY=ThisEndY
ThisRadious = ThisRadius * 0.67
ThisTheta = ThisTheta + 30
if ThisTheta >= 360:
ThisTheta = ThisTheta-360
if ThisTheta <= -360:
ThisTheta = ThisTheta + 360
ThisThetaRad = np.radians(ThisTheta)
ThisEndX = ThisEndX + np.sin(ThisThetaRad) * ThisRadius * ThisDirection
ThisEndY = ThisEndY + np.cos(ThisThetaRad) * ThisRadius
return (ThisBeginX, ThisBeginY, ThisEndX, ThisEndY, ThisRadius, ThisTheta)
###for文の位置を変更
for number in range(1, 10):
Main(number)
print(number, "回実行されました。") #1〜9までが出力されている
###変更
cv2.imshow('forest of objects', img)
cv2.waitKey(0)
```
しかし以下の問題が発生してしまいました。
・配列が増えていない
・レインボーカーソルが出てしまい、フリーズする
これはコードのどの部分に誤りがあるという事なのでしょうか?
回答1件
あなたの回答
tips
プレビュー