私はにゃんこ(猫)が好きです。自分でもアメショーを飼っていたし、道端で歩いている猫を見ていても、つい触りたくなります。ある夜、買い物途中で野良の子猫を触ろうとしたら、母猫にすごく怒られたことがあります。そんなわけで(どんなわけで?)、Python の色々なモジュールを使って、シンプルな猫のイラストを描いてみました。
Pythonで猫の顔を描きます
まず最初は組み込みモジュールの「タートルグラフィックス」を使って猫のイラストを描くコードです。
# Python draw cat # In[1] import turtle def draw_cat(): screen = turtle.Screen() screen.bgcolor("white") cat = turtle.Turtle() cat.speed(3) # Draw the head(にゃんこの頭) cat.penup() cat.goto(0, -50) cat.pendown() cat.circle(50) # Draw the left ear(にゃんこの左耳) cat.penup() cat.goto(-30, 10) cat.pendown() cat.goto(-60, 80) cat.goto(-20, 60) cat.goto(-30, 10) # Draw the right ear(にゃんこの右耳) cat.penup() cat.goto(30, 10) cat.pendown() cat.goto(60, 80) cat.goto(20, 60) cat.goto(30, 10) # Draw the eyes(にゃんこの目) cat.penup() cat.goto(-20, 20) cat.pendown() cat.circle(10) cat.penup() cat.goto(20, 20) cat.pendown() cat.circle(10) # Draw the nose(にゃんこの鼻) cat.penup() cat.goto(0, 10) cat.pendown() cat.circle(5) # Draw the mouth(にゃんこの口) cat.penup() cat.goto(-5, 5) cat.pendown() cat.goto(0, 0) cat.goto(5, 5) # Draw the whiskers(にゃんこのヒゲ) cat.penup() cat.goto(-30, 5) cat.pendown() cat.goto(-70, 5) cat.penup() cat.goto(-30, 0) cat.pendown() cat.goto(-70, -10) cat.penup() cat.goto(-30, -5) cat.pendown() cat.goto(-70, -20) cat.penup() cat.goto(30, 5) cat.pendown() cat.goto(70, 5) cat.penup() cat.goto(30, 0) cat.pendown() cat.goto(70, -10) cat.penup() cat.goto(30, -5) cat.pendown() cat.goto(70, -20) # Hide the turtle cat.hideturtle() # Keep the window open screen.mainloop() # Call the function to draw the cat draw_cat()
コードを実行すると、亀がぐるぐる回って猫の顔を一生懸命描いてくれます。次は matplotlib.pyplot と matplotlib.patches モジュールを使って猫の絵を描いてみます。
# In[2] import matplotlib.pyplot as plt import matplotlib.patches as patches def draw_cat(): fig, ax = plt.subplots() # Draw the head head = patches.Circle((0.5, 0.5), 0.3, edgecolor='black', facecolor='none', lw=2) ax.add_patch(head) # Draw the left ear left_ear = patches.Polygon([[0.3, 0.7], [0.2, 0.9], [0.4, 0.8]], closed=True, edgecolor='black', facecolor='none', lw=2) ax.add_patch(left_ear) # Draw the right ear right_ear = patches.Polygon([[0.7, 0.7], [0.8, 0.9], [0.6, 0.8]], closed=True, edgecolor='black', facecolor='none', lw=2) ax.add_patch(right_ear) # Draw the eyes left_eye = patches.Circle((0.4, 0.55), 0.05, edgecolor='black', facecolor='none', lw=2) ax.add_patch(left_eye) right_eye = patches.Circle((0.6, 0.55), 0.05, edgecolor='black', facecolor='none', lw=2) ax.add_patch(right_eye) # Draw the nose nose = patches.Polygon([[0.48, 0.5], [0.52, 0.5], [0.5, 0.45]], closed=True, edgecolor='black', facecolor='none', lw=2) ax.add_patch(nose) # Draw the mouth mouth_left = patches.Arc((0.49, 0.43), 0.04, 0.04, angle=0, theta1=0, theta2=180, edgecolor='black', lw=2) ax.add_patch(mouth_left) mouth_right = patches.Arc((0.51, 0.43), 0.04, 0.04, angle=0, theta1=0, theta2=180, edgecolor='black', lw=2) ax.add_patch(mouth_right) # Draw the whiskers ax.plot([0.3, 0.1], [0.5, 0.5], 'k-', lw=2) ax.plot([0.3, 0.1], [0.48, 0.46], 'k-', lw=2) ax.plot([0.3, 0.1], [0.52, 0.54], 'k-', lw=2) ax.plot([0.7, 0.9], [0.5, 0.5], 'k-', lw=2) ax.plot([0.7, 0.9], [0.48, 0.46], 'k-', lw=2) ax.plot([0.7, 0.9], [0.52, 0.54], 'k-', lw=2) # Set limits and aspect ratio ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_aspect('equal') # Hide axes ax.axis('off') plt.show() # Call the function to draw the cat draw_cat()
どんなかわいい「にゃんこ」が描かれるかは、実行してのお楽しみです。ぜひ試してみてください。お次は svgwrite を使って猫の絵を描くコードです。svgwrite は SVG ファイルを扱うライブラリです。組み込みではないので、別途にインストールしておく必要があります。
# In[3] import svgwrite def draw_cat_with_svgwrite(): dwg = svgwrite.Drawing('cat.svg', profile='tiny') # Draw the head dwg.add(dwg.circle(center=(200, 200), r=100, stroke='black', fill='none', stroke_width=3)) # Draw the left ear dwg.add(dwg.polygon(points=[(160, 100), (100, 30), (180, 80)], stroke='black', fill='none', stroke_width=3)) # Draw the right ear dwg.add(dwg.polygon(points=[(240, 100), (300, 30), (220, 80)], stroke='black', fill='none', stroke_width=3)) # Draw the eyes dwg.add(dwg.circle(center=(170, 180), r=15, stroke='black', fill='none', stroke_width=3)) dwg.add(dwg.circle(center=(230, 180), r=15, stroke='black', fill='none', stroke_width=3)) # Draw the nose dwg.add(dwg.polygon(points=[(195, 210), (205, 210), (200, 220)], stroke='black', fill='none', stroke_width=3)) # Draw the mouth dwg.add(dwg.path(d="M190,220 Q200,230 210,220", stroke='black', fill='none', stroke_width=3)) # Draw the whiskers dwg.add(dwg.line(start=(130, 200), end=(70, 200), stroke='black', stroke_width=3)) dwg.add(dwg.line(start=(130, 210), end=(70, 220), stroke='black', stroke_width=3)) dwg.add(dwg.line(start=(130, 190), end=(70, 180), stroke='black', stroke_width=3)) dwg.add(dwg.line(start=(270, 200), end=(330, 200), stroke='black', stroke_width=3)) dwg.add(dwg.line(start=(270, 210), end=(330, 220), stroke='black', stroke_width=3)) dwg.add(dwg.line(start=(270, 190), end=(330, 180), stroke='black', stroke_width=3)) # Save the drawing dwg.save() # Call the function to draw the cat draw_cat_with_svgwrite()
これも、どんなイラストが描かれるかは、実行してのお楽しみです。イラストはSVGファイルとして保存されます。実行結果を見て「下手」とか「センスない」とか、そういう類の文句は受け付けませんので、予めご了承ください。猫のアニメーションを作成してみようかとも思いましたが、難しそうなのでやめました(←向上心の皆無なエンジニア)。
コメント