2023年3月26日日曜日

へのへのもへじ

ネット上で誰かが,「へのへのもへじ」より「へめへめくつし」がいいねといった。ホウ,そんなものがあったのか,と一瞬思ったけれど,そういえば昔いろいろと試していたような気もする。それほどビックリする話題ではない。

むしろ,テレビで外国人の平熱が37度台であると知ったことの方が驚きだ。これは筋肉が多い人について成り立つらしく,日本のボディビルダーに体温がやはり37度台であることを検証していた。どこまで正しいかわからないけれど。

そこで,へのへのもへじ出力プログラムを作ってみた。最初は,TeXのTikZで書いた。こんな感じ。ベジェ曲線が手軽に使えるのがありがたい。

\begin{tikzpicture}
\draw[gray, step=1, dotted] (0,0) grid (6,6);
\draw (2,5) node[below]{\Huge \${〜}\$};
\draw (2,4) node[below]{\Huge \${め}\$};
\draw (4.2,5) node[below]{\Huge \${〜}\$};
\draw (4.2,4) node[below]{\Huge \${め}\$};
\draw (3,3) node[below]{\Huge \${く}\$};
\draw (3.3,1.9) node[below]{\Huge \${つ}\$};
\draw [ultra thick] (1,5.5) .. controls (0.5,2) and (1.25,0.75)  ..(2,0.5);
\draw [ultra thick] (2,0.5) .. controls (3,0) and (5,0)  ..(5.5,2);
\draw (5.5,3) node[below]{\Huge \${々}\$};
\end{tikzpicture}


図1:LaTeXのTikZで書いたへのへのもへ字

これだと,文字を入れ替えるたびにコードを書き換えることになる。そこで,pythonで作り直そうとしてGPT-4に聞いてみたら,ほぼ1発で正しいコードが得られた。macOSのフォントの場所だけを指定すれば良かった。さらに,コマンドラインからひらがなを入力して文字に分解するところもGPT-4に教えてもらった。これからのプログラミング教育はどうなるのだろう?

問題は,pythonのpillowライブラリにはベジェ曲線がないことだ。おまけに,最初の結果は顔の輪郭は直線4本で表され,顔に被ってしまっていた。GPT-4はそこまで賢いわけではない。仕方がないので,自力でもがいて作った折れ線グラフで代用している。プログラミング教育って絶対にこうなるから。論理的ではない部分が多すぎる。

#! ~/bin/python


from PIL import Image, ImageDraw, ImageFont

import sys


def generate_henohenomoheji(brow: str, eye: str, nose: str, mouth: str, file_name: str):

     

    # 背景画像を作成

    image = Image.new('RGB', (600,600), (255, 255, 255))

    draw = ImageDraw.Draw(image)


    # フォントの設定

    font_size = 80

    font = ImageFont.truetype("/Users/koshi/Library/Fonts/BIZUDGothic-Regular.ttf", font_size)


    # へのへのもへじの要素を描画

    draw.text((160, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((340, 120), brow, font=font, fill=(0, 0, 0))  # 眉毛

    draw.text((180, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((330, 200), eye, font=font, fill=(0, 0, 0))   # 目

    draw.text((240, 290), nose, font=font, fill=(0, 0, 0))  # 鼻

    draw.text((250, 380), mouth, font=font, fill=(0, 0, 0)) # 口

    draw.text((480, 240), "〃", font=font, fill=(0, 0, 0))  # 濁点


    # 顔の輪郭(ベジェ曲線ではない)

    contour = [

        (100, 100), (110, 150), (110, 200), (100, 250), (100, 300),

        (110, 340), (120, 380), (140, 410), (160, 440), (180, 460),

        (200, 480), (220, 490), (240, 500), (260, 505), (280, 505),

        (300, 500), (320, 500), (340, 495), (360, 495), (370, 490),

        (390, 480), (410, 470), (430, 460), (450, 440), (470, 410),

        (480, 380), (480, 360), (475, 340), (470, 310), (470, 280),

    ]

    draw.line(contour, width=5, fill=(0, 0, 0), joint="curve")


    # 画像の表示と保存

    image.show()

    image.save(file_name, "PNG")


moji = list(sys.argv[1])

brow = moji[0]

eye = moji[1]

nose = moji[2]

mouth = moji[3]

print(brow,eye,nose,mouth)

generate_henohenomoheji(brow,eye,nose,mouth, "heno-mohe.png")

図2:PythonのPillowによるへのへのもへ字

0 件のコメント: