Python/tkinterでの多角形の作り方(1)


2023年 10月 19日

よく見かける書き方

Python上で、上手のような多角形を描いてみようとしらどうするだろうか。

ここでは、一番手軽に標準で付いてくるtkinterを使って、絵を描くためのCanvasを用意し、その上で多角形を描いた。実際のプログラムが次である。

# N多角形の描画  Canvas.create_polygon

import tkinter as tk
from tkinter import Canvas
import numpy as np

app = tk.Tk()
app.title("Star")

canvas = Canvas(app,width=400,height=400)
canvas.pack()

canvas.create_polygon(200,40,105,329,352,150,47,150,294,329,fill="red")

app.mainloop()

多角形を生成するのがcreate_polygonで、どの本、Webのどのページを見ても基本的に以下のように使い方が示されている。なので、上のように、5頂点の座標を計算し、1つおきに並べてみた。

def create_polygon(x1, y1, x2, y2, ...., xn, yn, option, ....)

実際、サンプルを見ても、数個の点を結んで多角形を作るものばかりで、数字がベタに並んでいる。

実用的な書き方をしたい

上の説明に従うと、この50頂点ある図形

を描くには、

canvas.create_polygon(200, 40,122,340,335,114, 40,210,344,268, 105, 70,220,358,258, 51, 76,301,357,170,
                       47,150,309,316,160, 45,160,354,309, 83, 47,249,357,229, 76, 98,258,348,220, 41,
                      105,329,344,131, 40,189,335,285,122, 59, 199,360,277, 59, 64,285,359,189, 55,131,
                      294,329,179, 41,141,348,323, 98, 42,229, 352,249, 90, 83,239,354,239, 45, 90,316,
                      352,150, 42,170,323,301,141, 51,179,358, 294, 70, 55,268,359,210, 64,114,277,340, fill='blue')

と書くしかないのだろうか。最悪だ。

極端な例に思えるかもしれないが、地図で、各都道府県(あるいは市区町村、学区、など)を描いて、それぞれを対応した色で塗りつぶすことを考えてみよう。統計結果を地図で塗り分けて示すことは多いだろう。各都道府県をそれなりに正確に描こうとすると、頂点数は50個くらいにはすぐになるだろう。

こういう場合、頂点数は決まっていない(地形図データとして与えられる)ので、頂点の座標をリストの形で与えることにしないと、プログラムできない。

なぜ実用的でない説明のオンパレードなのか

書籍の説明では、実用性よりも理解度、分かりやすさが優先される。
それを考えれば、

def create_polygon(x1, y1, x2, y2, ...., xn, yn, option, ....)

は分かりやすい。特に、例は説得力がある。三角形、四角形、五角形などを座標列でベタに与えられ、その結果を見れば使い方が分かった気になる。

さらに、この説明を誰かが始めてしまうと、それに続く説明が、書籍、雑誌、ネットに溢れていて、そのうち誰も疑わなくなる。

しかし、実際にプログラムで使おうとすると、その不備に立ち止まらざるを得なくなる。

説明のためのサンプルプログラムではなく、実際に使うプログラムを組もうとすると、この仕様では使えないと必ず気づくはずなのだが….

書籍の説明が正統な書き方だと信じて読む入門者は多いだろう。そして、そのまま実際のプログラム作成に向かうだろう。そうして、経験者から「なんだこのプログラムは?」と言われることになる。本などに載る短い説明のためのプログラムサンプルと、実用プログラムとの差は大きく、それに気づくとより高いレベルの本に手を出すようになる。

印刷物を鵜呑みにする者は多い。論文もそうである。しかし、それらが正しい、あるいは良いかどうかは常に疑い、確認しながら読むべきである。そうすることで、本や論文に対する選別能力がつく。

ところで、頂点数がいくつでも困らない書き方を次回までになんとか用意しよう。create_polygonをコーディングした人は、ちゃんと用意していると思う。だって、グラフィックス系のプログラマなら100%用意するはずだから。