pythonとtkinterでグラフィック・アート
パソコンが出現してから間もない頃、当時のパソコンにはマイクロソフト系のBASICのROMが載っていました。そんな頃に買った「パソコン・グラフィックス・アート」(著者:工学博士 竹村伸一 発行元:株式会社オーム社)という本がありました。
何年か前に、ちょっと懐かしいので、この本からいくつかをpythonに書き換えてみたことがありました。
この本ではN88-BASICやF-BASICで動くようになっていて、画面は640×200になっていました。当時の私のパソコンはF-BASICがROMでなくフロッピーディスクで提供されていた少し高級機で、画面も640×400となっていました。なのでその当時からプログラムの縦横比を直しながら試していました。プログラムソースを見ていると、縦横比を調整する部分があって、それが懐かしかったりします。今のPCの画面は広大で縦横比の影響は無視できるので調整は不要。それにしても、やはりBASICは読みづらくて嫌いですね。
さて、当時のBASICには線を引いたり、円を描いたり、色で塗りつぶしたりするグラフィックス関係の命令が備わっていました。しかし本来のBASIC言語仕様にはそのような命令はなかったと思いますし、現在のpythonにもそのような命令はありません。
pythonにはGUI機能を提供するtkinterというライブラリーがありますので、この中のCanvasを使って点、線を自由に描くことが出来ます。
残念ながら当時のBASICのグラフッイクス命令の一部しか機能が無いので、簡単なものしか移植できませんでした。
記事が長くなるので、今回は一つだけを紹介します。
色を変えて扇形のパターンを描いています。
以下、python3.5でのソース
#!/usr/bin/env python3
"""
3_4.py
原典 パソコン・グラフィック・アート
著者:竹村伸一 発売元:株式会社オーム社
コンバート: sk
"""
import tkinter as tk
import math
def drange(begin, end, step):
n = begin
while n+step < end:
yield n
n += step
def cmd():
c = 1
n = 0
for b in range(100, 502, 160):
for a in range(0, 600, 180):
for th in drange(math.pi * 1/4, math.pi * 3.2/4, math.pi * 1/ 32 ):
x = 127 * math.cos(th)
y = 127 * math.sin(th)
gx = a + x
gy = b + y
if gx >=0 and gx < 640:
c0.create_line(a, b, gx, gy, fill = color[c], tag='lines')
c = c + 1
for th in drange(math.pi * 4.9/4, math.pi * 7.2/4, math.pi / 32):
x = 120 * math.cos(th)
y = 120 * math.sin(th)
gx = a + 90 + x
gy = b + 80 + y
if gx >=0 and gx < 640:
c0.create_line(a+90, b+82, gx, gy, fill = color[c], tag='lines')
c = c +1
if n != 1:
if c == 7 :
c = 1
if n !=1:
c = 9
c0.create_text(320,600,text='Fans',
fill='white',anchor='center', tag='lines')
def erase():
c0.delete('lines')
if __name__ == '__main__':
color = ('Black', 'Blue', 'Red', 'Purple', 'Green', 'Cyan', 'Yellow', 'White')
root = tk.Tk()
root.title('Fans')
c0 = tk.Canvas(root, width = 640, height = 640, bg = 'black')
c0.pack()
b = tk.Button(root, text = "描く", command = cmd)
b.pack( side = 'left', anchor='c')
b2 = tk.Button(root, text = '消す', command = erase)
b2.pack( side = 'left')
tk.mainloop()