中学の数学 (9-1) 鱗文様を python で描く
[ サイトマップを見る ]
日本の伝統的なデザイン
日本の伝統的なデザインは美しいです。幾何学図形を繰り返すことで,なんともいえないここちよいデザインが生まれます。
今回は,鱗紋様を Python で描いてみましょう。
鱗紋様
鱗紋様とは正三角形を繰り返したデザインをいいます。
魚や蛇の鱗に見えるので,鱗紋様というらしいです。これを Python で以下のように作ってみました。
Python のコード
かなり冗長なコードですが,どのように三角形を繰り返し描いているかを説明するために,あえて冗長に書いています。
from PIL import Image, ImageDraw
import math
im = Image.new('RGB', (40*10, math.floor(math.sqrt(3)*40*10)), (256, 256, 256))
draw = ImageDraw.Draw(im)
for i in range(0, 10):
for j in range(0, 10):
if i%2 == 0:
if j%2 == 0:
draw.polygon(((1*40*j, 0 + math.sqrt(3)*40*i),
(1*40*j, math.sqrt(3)*40 + math.sqrt(3)*40*i),
(1*40*j+1*40, math.sqrt(3)*40 + math.sqrt(3)*40*i)),
fill=(118, 215, 196), outline=(118, 215, 196))
else:
draw.polygon(((1*40*j+40, 0 + math.sqrt(3)*40*i),
(1*40*j, math.sqrt(3)*40 + math.sqrt(3)*40*i),
(1*40*j+1*40, math.sqrt(3)*40 + math.sqrt(3)*40*i)),
fill=(118, 215, 196), outline=(118, 215, 196))
else:
if j%2 == 0:
draw.polygon(((1*40*j+40, 0 + math.sqrt(3)*40*i),
(1*40*j, math.sqrt(3)*40 + math.sqrt(3)*40*i),
(1*40*j+1*40, math.sqrt(3)*40 + math.sqrt(3)*40*i)),
fill=(118, 215, 196), outline=(118, 215, 196))
else:
draw.polygon(((1*40*j, 0 + math.sqrt(3)*40*i),
(1*40*j, math.sqrt(3)*40 + math.sqrt(3)*40*i),
(1*40*j+1*40, math.sqrt(3)*40 + math.sqrt(3)*40*i)),
fill=(118, 215, 196), outline=(118, 215, 196))
im.show()
im.save('uroko.png')
どうやったら楽に描けるか
鱗紋様の1行目をみると,最初,正三角形の右半分から始まり,正三角形が続き,その後,正三角形の左半分で終わります。
正三角形の右半分
正三角形
正三角形の左半分
3種類の図形を描き分けてもいいですが,もっと簡単にできないか考えます。2 の正三角形は 1 の正三角形の右半分と 3 の左半分をあわせたらできます。でしたら,描く図形は次の2種類でいいことになります。
正三角形の右半分
正三角形の左半分
鱗紋様の1行目は 1, 2, 1, 2, 1, 2 の繰り返しで描けます。
2行目は 2, 1, 2, 1, 2, 1 の繰り返しで描けます。
30°,60°,90°の三角形の辺
正三角形を左と右で2つにわけると,図1のとおり三角形 ABCができます。角度 A, B, Cはそれぞれ 30°,60°,90°です。このとき,辺 AB, BC, CA の比は $${\sqrt{3}}$$, 1, 2 になります。
点 A を原点としましょう。A(0,0)です。
点 B は原点から y 軸方向に $${\sqrt{3}}$$ さがったところになります。ですから,B $${(0, \sqrt{3})}$$。点C は点B から x 軸で右に 1 進んだところにありますから,C $${(1, \sqrt{3})}$$。
あとは,for文を使って,三角形を描きはじめる位置を決めていけば,鱗紋様が描けます。
[ サイトマップを見る ]
この記事が気に入ったらサポートをしてみませんか?