Pythonで任意のパラメータkを用いてN芒星を描画するプログラム
Q&A
解決したいこと
Pythonの練習でN芒星を描画するプログラムを書いています。
参考書には以下のようなプログラムが記載されていました。
#N=5(5芒星)の場合
from PIL from Image, ImageDraw
from math import pi, sin, cos
img = Image.new("L",(256, 256), 255)
draw = ImageDraw.Draw(img)
cx = 128
cy = 128
r = 96
draw.ellipse((cx-r, cy-r, cx+r, cy+r))
N = 5
s = 2 * pi / N
k = N // 2
for i in range(N):
s1=((j * k) % N) * s - 0.5 * pi
s2=s1+s*k
x1=r*cos(s1)+cx
y1=r*sin(s1)+cy
x2=r*cos(s2)+cx
y2=r*sin(s2)+cy
draw.line((x1, y1, x2, y2))
img
しかし、k=N//2とするとNが奇数の場合しか描画できないため、N芒星を描画可能なkの値をリスト化し、リスト内の任意のkによって再描画を繰り返すというプログラムに改良したいと思い、以下のようなプログラムを書きました。
#N=7(7芒星)の場合
img = Image.new("L",(256, 256), 255)
draw = ImageDraw.Draw(img)
cx = 128
cy = 128
r = 96
draw.ellipse((cx-r, cy-r, cx+r, cy+r))
N=7
s=2*pi/N
mylist=[2, 3, 4, 5]
num=0 #以下のwhile文の制御変数
while num < 1:
k=int(input(str(mylist)+"の中から好きな数値を選んでください。処理を終了したい場合は0と入力してください。"))
if k in mylist:
print("true")
for j in range(N):
s1=((j * k) % N) * s - 0.5 * pi
s2=s1+s*k
x1=r*cos(s1)+cx
y1=r*sin(s1)+cy
x2=r*cos(s2)+cx
y2=r*sin(s2)+cy
draw.line((x1, y1, x2, y2))
img
elif k == 0:
break
else:
print("エラー") #選択肢外の数値を選択したらもう一度入力させる
kの値によって描画されるN芒星のパターンが変わります。
そのため、N芒星の描画が可能なkの値を示し、その中から任意のkを繰り返し入力してもらい、その都度再描画させることによって、kの値によるN芒星の形状の変化を表現したいのです。
しかし実行してみると、以下の写真のように描画だけがされない状態になります。
自分で試したこと
描画を実行する命令であるimgをif文の外に出し、num += 1でwhile文を抜けさせると、以下の写真のように描画はされました。しかし、ユーザーが終了の合図である0を入力するまで繰り返し再描画させたいので、これでは本末転倒です。
pythonにお詳しい方、是非お知恵をお貸しいただけると嬉しいです。
0